DataTable.Load(FbDataReader)不会将所有内容加载到DataTable中

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.

Tim*_*ter 5

即使我不知道问题所在,我也会建议使用 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)

为什么会这样?我认为另一个问题中的这个答案解释了它。


Neh*_*ain 5

DataTable.Load方法需要基础数据中的主键列(即 from DataReader)。看起来你的程序没有任何主键列,或者如果你有一个请用户order by在 sql 语句中,以便DataTable能够接受它作为主键。

这是一个非常古老的问题,DataTable.Load并且没有很好的记录。总的来说SQLDataAdapter还是不错的DataTable

在您的情况下,我认为一旦 Load 找到重复项,它就会停止加载数据。我没有在任何地方得到这个记录,但看起来像这个问题。