0

我是 ODP.Net 的新手,并试图将其实施到我们现有的系统中。目前,我们正在使用 OLEDB 并使用 IDataReader 接口从 DataReader 读取记录。但是,当我们使用相同的代码逻辑使用 ODP.Net 时,没有选择记录。所以,我的问题是,Oracle.DataAccess.Client.OracleDataReader (ODP.Net) 是否实现了 IDataReader 接口?如果我尝试使用 OracleDataReader 读取记录而不使用 IDataReader 选择的记录。

我正在使用 ODP.Net 10.1.0.4、Oracle 客户端 10g、ASP.Net

编辑:

string lstSelect = fstSelect + pstWhereClause;

IDbConnection lidcConn = fobCreateCon.CreateConnection();
lidcConn.ConnectionString = fstConStr;

IDbCommand lidcComm = fobCreateCon.CreateCommand();
lidcComm.Connection = lidcConn;
lidcComm.CommandText = lstSelect;

if (palParams != null)
{
 for (int i = 0; i < palParams.Length; i++)
 {
  IDbDataParameter lidpParam = fobCreateCon.CreateParameter(
   fstParameterPrefix + "PARA" + i.ToString(), palParams[i]);
  lidcComm.Parameters.Add(lidpParam);
 }
}

IDataReader lidrReader = null;
try
{
 lidcConn.Open();
 lidrReader = lidcComm.ExecuteReader(CommandBehavior.CloseConnection);
 bool lboReturn = lidrReader.Read();
 if (lboReturn)
 {
  fobEmployee.AR_Grace = lidrReader.IsDBNull(0) ? 0 : lidrReader.GetDecimal(0);
  fobEmployee.Card_Issued = lidrReader.IsDBNull(1) ? string.Empty : lidrReader.GetString(1); 
 }
 lidrReader.Close();
 return lboReturn;
}
finally
{
 if (lidrReader != null)
 {
  if (!lidrReader.IsClosed)
   lidrReader.Close();
  lidrReader.Dispose();
 }

 if (lidcConn.State != ConnectionState.Closed)
  lidcConn.Close();
 lidcConn.Dispose();
 lidcComm.Dispose();
}

以上是我们现在使用的代码。它与 OLEDB、SQLClient 完美配合。将此代码与 ODP.Net 一起使用时,不知何故没有记录返回。

当更改为此时,我们设法选择记录

OracleDataReader lidrReader = null;
try
{
 lidcConn.Open();
 lidrReader = (OracleDataReader)lidcComm.ExecuteReader(CommandBehavior.CloseConnection);
 if (lidrReader.HasRow)
 {
  lidrReader.Read();
  fobEmployee.AR_Grace = lidrReader.IsDBNull(0) ? 0 : lidrReader.GetDecimal(0);
  fobEmployee.Card_Issued = lidrReader.IsDBNull(1) ? string.Empty : lidrReader.GetString(1); 
 }
 lidrReader.Close();
}

我们无法将其更改为上述代码,因为它将涉及 300 多个数据文件类,我们希望此代码适用于其他数据库。有什么帮助吗?

4

1 回答 1

2

如果我们谈论System.Data.IDataReader的是,答案是肯定的。实际上,OracleDataReader继承自抽象类System.Data.Common.DbDataReader,而抽象类又继承自System.Data.IDataReader.

换句话说,Oracle 与 ADO.NET 配合得很好,并且应该或多或少地与其他 ADO.NET 提供程序一样工作。

虽然我没有尝试过 10.2.x 之前的版本,但我怀疑事情已经发生了显着变化。我对OracleDataReader.

于 2009-10-09T13:01:35.390 回答