You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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);
    }
}

代码问题分析

  1. SQL语句未参数化:代码里myDate=d是直接把C#变量写进SQL字符串,数据库根本识别不了这个d,查不到对应日期的数据。
  2. 集合未清空:theLocation集合没有在每次循环日期时清空,会把所有日期的位置数据累积在一起,导致每行数据是多天的位置叠加,不是单独一天的。
  3. 未处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:31:01