【问题标题】:Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader Missing ResultsOracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader 缺少结果
【发布时间】: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 中缺少的记录。

标签: c# oracle


【解决方案1】:

我最终从这个帖子中找出了我的问题:

Datareader skips first result

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

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

第一个 dr.Read() 是不必要的。去掉这行代码解决了这个问题。

最终修复:

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

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

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 2012-08-12
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多