【发布时间】:2017-08-18 02:21:29
【问题描述】:
我有一个非常简单的方法,它利用 Oracle.ManagedDataAccess 来查询 Oracle 中的数据表。代码如下。
private System.Data.DataTable ByQuery(Oracle.ManagedDataAccess.Client.OracleConnection connection, string query)
{
using(var cmd = new Oracle.ManagedDataAccess.Client.OracleCommand())
{
cmd.Connection = connection;
cmd.CommandText = query;
cmd.CommandType = System.Data.CommandType.Text;
var dr = cmd.ExecuteReader();
dr.Read();
var dataTable = new System.Data.DataTable();
dataTable.Load(dr);
var recordCount = dataTable.Rows.Count;
return dataTable;
}
}
使用非常简单的查询,例如:
SELECT * FROM NKW.VR_ORDER_LI WHERE CTRL_NO = 10
返回 32 行数据。但是,当我使用我在 C# 应用程序的连接字符串中使用的完全相同的用户帐户从 Oracle SQL Developer 运行完全相同的查询时,我得到 33 个结果。
我一直缺少一行数据。
我尝试过查询不同的 CTRL_NO:
SELECT * FROM NKW.VR_ORDER_LI WHERE CTRL_NO = 17
.Net 返回 8 个结果。 Oracle Sql Developer 返回 9 个结果。
我已经尝试删除 WHERE 语句并获得所有结果。
两者之间仍然相差1行。
我尝试在谷歌上搜索答案,但没有成功。任何帮助或建议将不胜感激。
更新 1:
我已经确定,当我从 C# 应用程序运行完全相同的查询时,我总是错过在 Oracle SQL Developer 中看到的第一个结果。
更新 2:
按照建议,我将 DataTable 排除在外。
int rowCount = 0;
while(dr.Read())
{
rowCount++;
}
rowCount 跳过 DataTable 仍会导致丢失记录。
更新 3:
针对完全不同的表进行测试,NKW.VR_ORDER_LI 实际上是一个视图。由于某种原因,结果仍然相同,我最终从 ExecuteReader() 获得的结果比我在 SQL Developer 中获得的结果少一排。
【问题讨论】:
-
我建议您避免数据表填充并使用读取器方法,这样 A) 您可以获得更多性能 B) 您可以控制可能在幕后发生的任何解析异常。
-
我还确定它总是抛出结果的第一行。无论查询在 Oracle SQL Developer 中显示为第一条记录,这就是 dataTable.Rows 中缺少的记录。