这里有一个相关的问题:.NET DataTable skips rows on Load(DataReader)
我有一个SQL查询,返回了169个结果。结果看起来像这样:
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
中。
DataReader
返回多少条记录?您是否在循环中使用了一个int
变量(while(sqlReader.Read()count++;)
)来查看数据库是否返回了39或169条记录?这样,您至少会知道您的问题是否与DataTable.Load
或查询有关。 - Tim SchmelterFbDataReader
工作正常,并返回所有应返回的结果。问题确实与DataTable.Load()
有关。 - waka