繁体   English   中英

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

[英]DataTable.Load shows less rows than source DataReader

我刚刚注意到在 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 个结果!

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

数据读取器截图

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

数据表截图

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

我的意思是,分析所得到的数据集,每一个存在于MS SQL数据集,但在MySQL数据集示出了缺少下面作为下一个完全相同的一对1列和3的屏幕截图的行。 在我的示例中,这些列分别是CN 而且,同样,这些列不是主键的一部分

数据集片段

我的问题是

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM