gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:57:42 26 4
gpt4 key购买 nike

我刚刚注意到在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com