【发布时间】:2014-05-05 00:24:11
【问题描述】:
这里有一个密切相关的问题:.NET DataTable skips rows on Load(DataReader)
我有一个返回 169 个结果的 SQL 查询。结果如下所示:
CustomerID Customer Name TerminalID Creation Date
1 First Customer 12345 2010-07-07
1 First Customer 12346 2010-07-07
1 First Customer 12347 2010-07-07
2 Second Customer 23456 2011-04-18
这个结果是正确的。
我在一个 C# 程序中输入查询并像这样执行它:
public DataTable getDataTableFromSql(FbCommand command)
{
// Create a new datatable
DataTable result = new DataTable();
// Set up the connection
using (FbConnection con = new FbConnection(this.connectionString))
{
// Open the connection
con.Open();
// Set up the select command
FbCommand sqlCmd = command;
// Add the connection to it
sqlCmd.Connection = con;
try
{
// Get the results
using (FbDataReader sqlReader = sqlCmd.ExecuteReader())
{
// Load the results into the table
result.Load(sqlReader);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
// Return the table
return result;
}
此代码经过测试,适用于许多不同的 SQL 查询。
但对于上述查询,DataTable 仅包含 39 个结果,如下所示:
CustomerID Customer Name TerminalID Creation Date
1 First Customer 12347 2010-07-07
2 Second Customer 23456 2011-04-18
我稍微摆弄了一下代码,这是我目前发现的:FbDataReader 正确地从数据库中获取结果。如果我只查询TerminalID,我最终会在DataTable 中得到169 个结果。如果我查询CustomerID,我会收到 39 个结果。
结论:result.Load(sqlReader) 行将CustomerID 的结果分组并丢弃所有其他结果,无论它们是否可以分组。
为什么会这样?如何将我的查询结果加载到DataTable 而不会由于不合逻辑的分组而“丢失”任何行?为什么DataTable首先“分组”了结果?
注意:我还尝试了所有三个可用于DataTables 的LoadOptions,结果都相同:只有 39 个结果加载到 DataTable。
【问题讨论】:
-
你试过用dataadapter填充吗?
-
什么意思 " 如果我只查询 TerminalID"?如果您查看
DataTable内容,您在哪里以及如何查询它? -
@TimSchmelter:这意味着我编辑了我的 SQL 查询,以便它只返回列
TerminalId。当我再次运行程序时,我在DataTable中收到所有 169 个结果。 -
@waka:
DataReader返回多少条记录?您是否在循环中使用了int变量(while(sqlReader.Read()count++;))来查看数据库返回 39 条还是 169 条记录?那么你至少会知道你的问题是与DataTable.Load有关还是与查询有关。