C#学习教程:DataTable.Load(FbDataReader)doesn'tloadeverythingintoDataTable)我有一个返回169个结果的SQL查询。结果如下:CustomerIDCustomerNameTerminalIDCreationDate1FirstCustomer123452010-07-071FirstCustomer123462010-07-071FirstCustomer123472010-07-072SecondCustomer234562011-04这个结果为真.我在C#程序中输入查询并执行它:publicDataTablegetDataTableFromSql(FbCommandcommand){//创建一个新的数据表DataTableresult=newDataTable();//使用(FbConnectioncon=newFbConnection(this.connectionString))设置连接{//打开连接con.Open();//设置选择命令FbCommandsqlCmd=command;//添加连接到它sqlCmd.Connection=con;try{//使用(FbDataReadersqlReader=sqlCmd.ExecuteReader())获取结果{//将结果加载到表中result.Load(sqlReader);}}catch(Exceptionex){Console.WriteLine(ex);}}//返回表返回结果;这段代码已经过测试,适用于许多不同的SQL查询。但是对于上面的查询,DataTable只包含39个结果,如下所示:CustomerIDCustomerNameTerminalIDCreationDate1FirstCustomer123472010-07-072SecondCustomer234562011-04-18我对代码做了一些调整,这就是到目前为止我发现:FbDataReader正确地从数据库中获取结果。如果我只查询TerminalID,我最终会在DataTable中得到169个结果。如果我查询CustomerID,我会得到39个结果。结论:行结果result.Load(sqlReader)按CustomerID对结果进行分组,并丢弃所有其他结果,无论它们是否可以分组。为什么?如何将查询结果加载到DataTable中而不因非逻辑分组而“丢失”任何行?为什么DataTable首先将结果“分组”?注意:我还尝试了DataTables可用的所有三个LoadOptions,它们都有相同的结果:只有39个结果被加载到DataTable中。尽管我不知道问题所在,但我还是推荐使用DataAdapter。也许这行得通://Gettheresultsusing(varda=newFbDataAdapter(sqlCmd)){//将结果加载到表中da.Fill(result);为什么会这样?我认为另一个问题的答案解释了这一点。DataTable.Load方法需要基础数据中的主键列(即来自DataReader)。看起来您的过程没有任何主键列,或者如果您在sql语句中有一个主键列,请用户排序,以便DataTable可以接受它作为主键列。这是DataTable.Load的一个非常古老的问题,没有很好的记录。通常,SQLDataAdapter适用于DataTable。在您的情况下,我认为一旦Load找到重复项,它就会停止加载数据。我没有在任何地方记录这些,但看起来这就是问题所在。问题的灵魂如下:DataTable.Load()在结果中查找主键。如果它尝试加载到DataTable的主键已经存在于该表中,它将用新结果覆盖该行。但是,为具有主键的列使用不同的别名确实解决了问题,所有结果都加载到DataTable中,因为看起来该列是主键的信息被使用别名覆盖了。以上就是C#学习教程:DataTable.Load(FbDataReader)不会将所有内容加载到DataTable中共享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——本文来自网络收藏,不代表立场,如涉及侵权,请右击联系管理员删除。如需转载请注明出处:
