表结构及数据如下:
下面使用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
{
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
{
daRow[columns[i].ColumnName] = dr.GetValue(i);
}
dt.Rows.Add(daRow);
}
ds.Tables.Add(dt);
} while (dr.NextResult());
}
}
结果就是,DataReader的address字段的值错误的赋给Datatable的name字段:
所以是否可以在构建Datatable的columns时,不对列名重复进行判断,使之直接抛出“存在重复列”的异常,这样可以及早的发现问题。错误的赋值如果没被发现的话,有可能会导致意想不到的后果。