wak*_*aka 7 c# datatable firebird
这里有一个密切相关的问题:.NET DataTable在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
Run Code Online (Sandbox Code Playgroud)
这个结果是正确的.
我在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;
}
Run Code Online (Sandbox Code Playgroud)
此代码已经过测试,适用于许多不同的SQL查询.但对于上面的查询,DataTable只包含39个结果,如下所示:
CustomerID Customer Name TerminalID Creation Date
1 First Customer 12347 2010-07-07
2 Second Customer 23456 2011-04-18
Run Code Online (Sandbox Code Playgroud)
我对代码进行了一些调整,这是我到目前为止所发现的:FbDataReader正确地从数据库中获取结果.如果我只是查询TerminalID我最终得到169结果DataTable.如果我查询CustomerID我收到的39个结果.
结论:该行将result.Load(sqlReader)结果分组CustomerID并丢弃所有其他结果,无论它们是否可以分组.
为什么会这样?如何将查询结果加载到DataTable由于非逻辑分组而没有"丢失"任何行的情况下?为什么DataTable"组"结果首先?
注意:我也尝试了所有三个LoadOptions可用DataTables的结果:结果相同:只有39个结果被加载到DataTable.
即使我不知道问题所在,我也会建议使用 aDataAdapter代替。也许这有效:
// Get the results
using(var da = new FbDataAdapter(sqlCmd))
{
// Load the results into the table
da.Fill(result);
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我认为另一个问题中的这个答案解释了它。
该DataTable.Load方法需要基础数据中的主键列(即 from DataReader)。看起来你的程序没有任何主键列,或者如果你有一个请用户order by在 sql 语句中,以便DataTable能够接受它作为主键。
这是一个非常古老的问题,DataTable.Load并且没有很好的记录。总的来说SQLDataAdapter还是不错的DataTable。
在您的情况下,我认为一旦 Load 找到重复项,它就会停止加载数据。我没有在任何地方得到这个记录,但看起来像这个问题。
| 归档时间: |
|
| 查看次数: |
4360 次 |
| 最近记录: |