Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader



我有一个非常简单的方法,它利用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 开发人员运行完全相同的查询时,我得到 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 开发人员中看到的第一个结果。

更新 2:

正如建议的那样,我将数据表从等式中剔除。

int rowCount = 0;
while(dr.Read())
{
rowCount++;
}

rowCount 跳过数据表仍会导致缺少记录。

更新 3:

针对完全不同的表NKW进行了测试。VR_ORDER_LI实际上是一种观点。 由于某种原因,我最终从 ExecuteReader(( 获得的结果比我在 SQL 开发人员中的结果少一行。

我最终从这个线程中找出了我的问题:

数据读取器跳过第一个结果

所以这一切的罪魁祸首是代码的这一部分:

var dr = cmd.ExecuteReader();
dr.Read();
var dataTable = new System.Data.DataTable();
dataTable.Load(dr);

第一位博士。Read(( 不是必需的。 摆脱这行代码解决了这个问题。

最终修复:

var dr = cmd.ExecuteReader();
var dataTable = new System.Data.DataTable();
dataTable.Load(dr);

我还回到了使用 DataTable 的方法,因为它与我们当前在整个项目中与事务数据的交互方式更加一致。

最新更新