我有一个非常简单的方法,它利用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 的方法,因为它与我们当前在整个项目中与事务数据的交互方式更加一致。