c# - DataTable.Load 显示的行数少于源 DataReader

标签 c# mysql datatable

我刚刚注意到在 MySQL 和 SQL Server 上运行的 ASP.NET 应用程序中有一个奇怪的行为。

应用程序通过 EF 连接发出纯 SQL 查询以构建数据集。结果集不包含任何主代理键(主键不是 SELECT 语句的一部分)。查询非常复杂,我不允许展示它们,但我可以非常清楚地解释发生了什么。

给定查询为

select a.A01, a.A01a, a.A01b, a.A02, a.A03, A11, A12, A12a, A12b, A12c, A21, A22, A23, A24, A25, A31, A31a, A31b, A32, A33, A33a, A33b, A33c, A34, A41, A42, A43, A51, A52, A53, A54, A54a, A54b, A54c, B11, B12, B13, B14, B15, Z0, a.prog, a.utente, C11, D11, D13, D14, D14a, D14b, D14c, D15, D16, D17, D18, D19, D21, D22, D23, D31, D32, D41, D42, D43, D44, D45, Z1
FROM TABLE_A JOIN TABLE_B
WHERE SOME_CONDITION
ORDER BY a.a21 ASC, a.a03 ASC LIMIT 20000

以下代码片段发出查询:

    protected DataTable GetDataTableV1(string aSqlStatement)
    {
        DataTable dtResult = new DataTable();

        using (DbContext dataContext = GetDataContext())
        {
            using (IDbConnection connection = dataContext.Database.Connection)
            {
                connection.Open();
                using (IDbCommand command = connection.CreateCommand())
                {
                    command.CommandText = aSqlStatement;
                    using (IDataReader reader = command.ExecuteReader())
                    {
                        dtResult.Load(reader);
                    }
                }
            }
        }
        return dtResult;
    }

查询在 Workbench 和 SMSS 中运行,在我的案例中返回 1192 个结果。没事儿。但是当应用程序在 MYSQL 上运行时,我只得到 1156 个结果!

如果我调试到在 MySQL 上运行的 dtResult.Load(reader);,我会得到一个意外的行为(并且只在 MySQL 上):reader 由 1192 个结果组成。

DataReader screenshot

显然,从调试中读取 DataReader 会消耗它,所以我可以再次调试它。 现在显示1156条记录!

DataTable screenshot

由于代码中的“导出为 CSV”功能,我检查了结果数据集。还记得查询是按字段 A21A03 升序排列的吗?看起来虽然这些字段不是主键的一部分、唯一的、不同的或其他任何内容,但 DataTable 会删除具有匹配对的行。

我的意思是,分析生成的数据集,在 MS SQL 数据集中存在但在 MySQL 数据集中缺失的每一行都显示完全相同的一对下面截图的第 1 列和第 3 列作为下一个。在我的示例中,这些列分别是 CN。而且,这些列不是主键的一部分

Dataset fragment

我的问题是

为什么 DataTable 在 MySQL 上表现得像这样?如何将完整的结果集包含在我的 DataTable 中?

最佳答案

解决方案是将整个查询包装在 SELECT 语句中,完全按照描述 here

关于c# - DataTable.Load 显示的行数少于源 DataReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28676382/

相关文章:

javascript - Jquery方法捕获嵌套div内的复选框点击

sql - Mysql查询查询记录时出现的问题

php - 如果条件成功后 isset 无法正常工作

Java,MySQL : myStatement.executeUpdate INSERT INTO 给出 NullPointerException

java - 读取Excel工作表的空单元格

java - Datatables Spring 4 Hibernate Tiles 3配置错误

c# - 为 TextBox 控件引发了哪些验证事件?

c# - 在C#中更改Label的颜色

c# - 通过数据表使用 Linq to GroupBy 和 Case When

c# - 为什么 MtpDevice.ImportFile 总是失败?