使用Ado.GetDataTable()方法时,当查询sql存在同名列时存在的问题 返回

C#论坛
3 374
该叫什么 Tom 发布于2021/2/5
悬赏:5 飞吻

表结构及数据如下:

image.png


下面使用IAdo.GetDataTable()查询数据。(注意查询sql中,查询了两遍name字段)

SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
    DbType = DbType.MySql,
    ConnectionString = Config.ConnectionString,
    InitKeyType = InitKeyType.Attribute,
    IsAutoCloseConnection = true
});
//sql
var dt = db.Ado.GetDataTable("select id, name, name, address from student");


在Sqlsugar.MySqlDataAdapter.Fill(DataSet ds)方法中:

DataReader读出来的字段列表如下:

id  name    name    address


框架根据DataReader构建出来的Datatable的字段列表如下:

id  name    adress


可以看到DataReader读出来的字段列表,与之构建的Datatable的的字段列表不一致,

是因为在Sqlsugar.MySqlDataAdapter.Fill(DataSet ds)方法中,在构建Datatable列时,把同名列name给排除掉了一个,因此导致字段对应不上:

public void Fill(DataSet ds)
{
    if (ds == null)
    {
        ds = new DataSet();
    }
    using (MySqlDataReader dr = command.ExecuteReader())
    {
        do
        {
            var dt = new DataTable();
            var columns = dt.Columns;
            var rows = dt.Rows;
            for (int i = 0; i < dr.FieldCount; i++)
            {
                string name = dr.GetName(i).Trim();
                if (!columns.Contains(name))    ///////////////////////////////////////////这里排除掉了
                    columns.Add(new DataColumn(name, dr.GetFieldType(i)));
            }

            while (dr.Read())
            {
                DataRow daRow = dt.NewRow();
                for (int i = 0; i < columns.Count; i++)
                {
                    daRow[columns[i].ColumnName] = dr.GetValue(i);
                }
                dt.Rows.Add(daRow);
            }
            ds.Tables.Add(dt);
        } while (dr.NextResult());
    }
}

结果就是,DataReader的address字段的值错误的赋给Datatable的name字段:

image.png


所以是否可以在构建Datatable的columns时,不对列名重复进行判断,使之直接抛出“存在重复列”的异常,这样可以及早的发现问题。错误的赋值如果没被发现的话,有可能会导致意想不到的后果。


热忱回答3

  • 目前是按取第一个重复列的值,也复合多数用户 ,这个我认为合理,你如果想要不同结果也不会出现重复列

    0 回复
  • Ramon Ramon VIP0
    1个月前

    我也有同样的问题

    0 回复
  • Ramon Ramon VIP0
    1个月前

    @fate stay night:发现.net fx的就没问题,.netcore的包就有问题

    0 回复