我刚刚注意到在我的ASP.NET应用程序中运行MySQL和SQL Server时出现了一种奇怪的行为。
应用程序通过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上):读者是由1192个结果组成的。
显然,从调试中读取DataReader会消耗它,所以我可以再次调试它。 现在它显示了1156条记录!
由于"导出到CSV"我检查了结果数据集。代码中的功能。请记住,查询按字段A21
和A03
升序排序?看起来虽然这些字段不是主键,唯一,不同或其他的一部分,但DataTable会删除具有匹配对的行。
我的意思是,分析结果数据集,MS SQL数据集中存在的每一行,但MySQL数据集中缺失显示同一对下面的屏幕截图的第1列和第3列作为下一个。在我的示例中,这些列分别为C
和N
。而且,这些列也不是主键的一部分
为什么DataTable在MySQL上的行为类似 ?如何在DataTable中包含完整的结果集?