如何将SQL查询结果转换为多列Location的DataTable并合并同组行
员工位置数据多行转多列问题解决
你需要把SQL查询到的员工位置数据(同一EmpID、日期、星期对应多个Location的多行记录)转换成同一行带多列Location的DataTable结构,最多支持15个Location列。你用C#数组尝试实现但没达到预期,提供的代码如下:
for (DateTime d = dateSTART.Value; d <= dateEND.Value; d = d.AddDays(1)) { cmd = new OleDbCommand("SELECT myLocation FROM EmpTable where EmpID=1 and myDate=d", con); dr = cmd.ExecuteReader(); if (dr.HasRows) { while (dr.Read()) { theLocation.Add(dr["myLocation"].ToString()); } string[] casesArray = theLocation.ToArray(); dataGridView1.Rows.Add(casesArray); } }
代码问题分析
- SQL语句未参数化:代码里
myDate=d是直接把C#变量写进SQL字符串,数据库根本识别不了这个d,查不到对应日期的数据。 - 集合未清空:
theLocation集合没有在每次循环日期时清空,会把所有日期的位置数据累积在一起,导致每行数据是多天的位置叠加,不是单独一天的。 - 未处理15列限制:没有控制最多15个Location列,超过15个会多出列,不足15个也没补空值,不符合要求。
修正后的实现代码
先初始化符合要求的DataTable,再按日期查询数据并整理成一行:
// 初始化DataTable,定义列 DataTable dt = new DataTable(); dt.Columns.Add("EmpID", typeof(int)); dt.Columns.Add("日期", typeof(DateTime)); dt.Columns.Add("星期", typeof(string)); // 添加15个Location列 for (int i = 1; i <= 15; i++) { dt.Columns.Add($"Location{i}", typeof(string)); } // 遍历日期范围 for (DateTime d = dateSTART.Value; d <= dateEND.Value; d = d.AddDays(1)) { // 每次循环清空位置集合 List<string> theLocation = new List<string>(); // 使用参数化SQL,避免错误和注入 using (OleDbCommand cmd = new OleDbCommand("SELECT myLocation FROM EmpTable WHERE EmpID=? AND myDate=?", con)) { cmd.Parameters.AddWithValue("@EmpID", 1); cmd.Parameters.AddWithValue("@myDate", d); using (OleDbDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { theLocation.Add(dr["myLocation"].ToString()); } } } // 准备行数据:EmpID、日期、星期,然后是Location(最多15个,不足补空) object[] rowData = new object[18]; // 3个基础列 + 15个Location列 rowData[0] = 1; rowData[1] = d; rowData[2] = d.ToString("dddd"); // 获取星期几,可根据需求调整格式 // 填充Location数据 for (int i = 0; i < 15; i++) { rowData[3 + i] = i < theLocation.Count ? theLocation[i] : string.Empty; } // 添加到DataTable dt.Rows.Add(rowData); } // 绑定到DataGridView dataGridView1.DataSource = dt;
说明
- 参数化SQL解决了日期查询的错误问题,同时避免SQL注入风险
- 每次循环重新创建
theLocation集合,确保每行仅包含当天的位置数据 - 严格控制15个Location列,不足的自动补空字符串,符合需求
- 先将数据整理到DataTable再绑定到DataGridView,比直接添加行更规范
内容的提问来源于stack exchange,提问作者Vicky_Smaith
相关产品推荐
相关产品推荐

