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

DataTable.Load shows less rows than source DataReader

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

应用程序通过 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 中,returns 1192 结果在我的案例中。那也行。但是当应用 运行s 在 MYSQL 上时,我只得到 1156 个结果!

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

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

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

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

我的问题是

为什么 DataTable 在 MySQL 上 如此?如何将完整的结果集包含在我的 DataTable 中?

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

所述