使用Ado.GetDataTable()方法时,当查询sql存在同名列时存在的问题 返回
表结构及数据如下:

下面使用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字段:

所以是否可以在构建Datatable的columns时,不对列名重复进行判断,使之直接抛出“存在重复列”的异常,这样可以及早的发现问题。错误的赋值如果没被发现的话,有可能会导致意想不到的后果。
热忱回答(3)
-
fate stay night VIP0
2021/2/5目前是按取第一个重复列的值,也复合多数用户 ,这个我认为合理,你如果想要不同结果也不会出现重复列
0 回复 -
Ramon VIP0
2021/7/28我也有同样的问题
0 回复 -
Ramon VIP0
2021/7/29@fate stay night:发现.net fx的就没问题,.netcore的包就有问题
0 回复