DataReader 如何读取 Oracle.DataAccess.dll中 的 RefCursor

XBodhi. 2013-08-14 06:17:02
如题:

 /// <summary>
/// 功能描述:设置分页存储过程的DbDataParameter[]
/// 说明:此方法为基础分页参数设置方法,开发者可以重写,也可以直接调用。
/// 特殊说明:此方法只能在数据实例为Oracle的时候使用。
/// </summary>
/// <param name="pageIndex">页索引</param>
/// <param name="pageSize">每页的数量</param>
/// <param name="inputSqlString">输入的SQL语句字符串</param>
/// <param name="orderBy">要排序的字段名。格式:{Field1 [SortMode(DESC | ASC)]......,n [SortMode(DESC | ASC)]}</param>
/// <returns>DbCommand的参数集合</returns>
protected virtual DbParameter[] GetPagingDbDataParameters(int pageIndex, int pageSize, StringBuilder inputSqlString, string orderBy)
{
DbParameter[] parameters =
{
this.odpDotNetFactory.CreateInstance<DbParameter>(ManifestConst.ORACLE_DATAACCESS_CLIENT_ORACLEPARAMETER),
this.odpDotNetFactory.CreateInstance<DbParameter>(ManifestConst.ORACLE_DATAACCESS_CLIENT_ORACLEPARAMETER),
this.odpDotNetFactory.CreateInstance<DbParameter>(ManifestConst.ORACLE_DATAACCESS_CLIENT_ORACLEPARAMETER),
this.odpDotNetFactory.CreateInstance<DbParameter>(ManifestConst.ORACLE_DATAACCESS_CLIENT_ORACLEPARAMETER),
this.odpDotNetFactory.CreateInstance<DbParameter>(ManifestConst.ORACLE_DATAACCESS_CLIENT_ORACLEPARAMETER),
this.odpDotNetFactory.CreateInstance<DbParameter>(ManifestConst.ORACLE_DATAACCESS_CLIENT_ORACLEPARAMETER),
this.odpDotNetFactory.CreateInstance<DbParameter>(ManifestConst.ORACLE_DATAACCESS_CLIENT_ORACLEPARAMETER)
};
Type oracleDbType = this.odpDotNetFactory.CreateInstance<Enum>(ManifestConst.ORACLE_DATAACCESS_CLIENT_ORACLEDBTYPE).GetType();
FieldInfo _refCursor = oracleDbType.GetField("RefCursor");
FieldInfo _Int32 = oracleDbType.GetField("Int32");
parameters[0].ParameterName = ":RESULTS";
parameters[0].GetType().GetProperty("OracleDbType").SetValue(parameters[0], _refCursor.GetValue(_refCursor), null);
parameters[0].Direction = ParameterDirection.Output;

parameters[1].ParameterName = ":TOTALRECORDCOUNT";
parameters[1].GetType().GetProperty("OracleDbType").SetValue(parameters[1], _Int32.GetValue(_Int32), null);
parameters[1].Direction = ParameterDirection.Output;

parameters[2].ParameterName = ":TOTALPAGECOUNT";
parameters[2].GetType().GetProperty("OracleDbType").SetValue(parameters[2], _Int32.GetValue(_Int32), null);
parameters[2].Direction = ParameterDirection.Output;

parameters[3].ParameterName = ":PAGEINDEX";
parameters[3].Value = pageIndex;
parameters[4].ParameterName = ":PAGESIZE";
parameters[4].Value = pageSize;
parameters[5].ParameterName = ":INPUTSQLSTRING";
parameters[5].Value = inputSqlString.ToString();
parameters[6].ParameterName = ":ORDERBY";
parameters[6].Value = orderBy;
return parameters;


类型已经通过反射赋值进去。

但是还是报错如下信息:

“/”应用程序中的服务器错误。
ORA-06550: 第 1 行, 第 7 列:
PLS-00306: 调用 'PROCEDURE_COMMONPAGING' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: Oracle.DataAccess.Client.OracleException: ORA-06550: 第 1 行, 第 7 列:
PLS-00306: 调用 'PROCEDURE_COMMONPAGING' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored

源错误:


行 367: {
行 368: DbCommand cmd = CreateDbCommand(this.MainConnection, commandType, commandText, parameters);
行 369: dataReader = cmd.ExecuteReader(commandBehavior);
行 370: }
行 371: catch (DbException dex)


源文件: D:\乔虎跃\Work\Project\Archstar.Framework\ArchStar.Framework\Helpers\AbstractClass\DbHelper.cs 行: 369

堆栈跟踪:


[OracleException (0x80004005): ORA-06550: 第 1 行, 第 7 列:
PLS-00306: 调用 'PROCEDURE_COMMONPAGING' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored]
Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck) +1316
Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, Boolean bCheck) +69
Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) +5449
Oracle.DataAccess.Client.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior) +69
System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10
ArchStar.Framework.Helpers.DbHelper.ExecuteReader(CommandType commandType, StringBuilder commandText, CommandBehavior commandBehavior, DbParameter[] parameters) in D:\乔虎跃\Work\Project\Archstar.Framework\ArchStar.Framework\Helpers\AbstractClass\DbHelper.cs:369

[DbHelperException: ORA-06550: 第 1 行, 第 7 列:
PLS-00306: 调用 'PROCEDURE_COMMONPAGING' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored]
ArchStar.Framework.Helpers.DbHelper.ExecuteReader(CommandType commandType, StringBuilder commandText, CommandBehavior commandBehavior, DbParameter[] parameters) in D:\乔虎跃\Work\Project\Archstar.Framework\ArchStar.Framework\Helpers\AbstractClass\DbHelper.cs:373
ArchStar.Framework.Helpers.DbHelper.ExecuteReader(CommandType commandType, StringBuilder commandText, DbParameter[] parameters) in D:\乔虎跃\Work\Project\Archstar.Framework\ArchStar.Framework\Helpers\AbstractClass\DbHelper.cs:351
ArchStar.Framework.Helpers.DbHelper.ExecuteReader(StringBuilder commandText, DbParameter[] parameters) in D:\乔虎跃\Work\Project\Archstar.Framework\ArchStar.Framework\Helpers\AbstractClass\DbHelper.cs:338
ArchStar.Framework.DataAccessLayer.BaseDataAccess`1.GetPagedData(Int32 pageIndex, Int32 pageSize, StringBuilder inputSqlString, String orderBy, Int32& totalRecordCount, Int32& totalPageCount) in D:\乔虎跃\Work\Project\Archstar.Framework\ArchStar.Framework.DataAccessLayer\BaseDataAccess.cs:198

[DataAccessLayerException: ORA-06550: 第 1 行, 第 7 列:
PLS-00306: 调用 'PROCEDURE_COMMONPAGING' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored]
ArchStar.Framework.DataAccessLayer.BaseDataAccess`1.GetPagedData(Int32 pageIndex, Int32 pageSize, StringBuilder inputSqlString, String orderBy, Int32& totalRecordCount, Int32& totalPageCount) in D:\乔虎跃\Work\Project\Archstar.Framework\ArchStar.Framework.DataAccessLayer\BaseDataAccess.cs:207
ArchStar.MES.Basic.DataAccessLayer.Material.MaterialDefaultMasterData.GetPagedData(IDictionary`2 where, Int32 pageIndex, Int32 pageSize, Int32& totalRecordCount, Int32& totalPageCount) in D:\乔虎跃\Work\Project\ArchstarMES\trunk\ArchStar.MES.Basic\ArchStar.MES.Basic.DataAccessLayer\Material\MaterialDefaultMasterData.cs:58
ArchStar.MES.Basic.BusinessLogicLayer.Material.MaterialDefaultMasterLogic.GetMaterialDefaultMastersByPartID(IList`1 partIDs, Int32 pageIndex, Int32 pageSize, Int32& totalRecordCount, Int32& totalPageCount) in D:\乔虎跃\Work\Project\ArchstarMES\trunk\ArchStar.MES.Basic\ArchStar.MES.Basic.BusinessLogicLayer\Material\MaterialDefaultMasterLogic.cs:73

[BusinessLogicLayerException: ORA-06550: 第 1 行, 第 7 列:
PLS-00306: 调用 'PROCEDURE_COMMONPAGING' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored]
ArchStar.MES.Basic.BusinessLogicLayer.Material.MaterialDefaultMasterLogic.GetMaterialDefaultMastersByPartID(IList`1 partIDs, Int32 pageIndex, Int32 pageSize, Int32& totalRecordCount, Int32& totalPageCount) in D:\乔虎跃\Work\Project\ArchstarMES\trunk\ArchStar.MES.Basic\ArchStar.MES.Basic.BusinessLogicLayer\Material\MaterialDefaultMasterLogic.cs:87
ArchStar.MES.Basic.BusinessLogicLayer.Material.MaterialMasterUpdateLogic.GetMaterialMasterUpdateUIDataSource(IList`1 partIDs, Int32 pageIndex, Int32 pageSize, Int32& totalRecordCount, Int32& totalPageCount) in D:\乔虎跃\Work\Project\ArchstarMES\trunk\ArchStar.MES.Basic\ArchStar.MES.Basic.BusinessLogicLayer\Material\MaterialMasterUpdateLogic.cs:91

[BusinessLogicLayerException: ORA-06550: 第 1 行, 第 7 列:
PLS-00306: 调用 'PROCEDURE_COMMONPAGING' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored]
ArchStar.MES.Basic.BusinessLogicLayer.Material.MaterialMasterUpdateLogic.GetMaterialMasterUpdateUIDataSource(IList`1 partIDs, Int32 pageIndex, Int32 pageSize, Int32& totalRecordCount, Int32& totalPageCount) in D:\乔虎跃\Work\Project\ArchstarMES\trunk\ArchStar.MES.Basic\ArchStar.MES.Basic.BusinessLogicLayer\Material\MaterialMasterUpdateLogic.cs:95
ArchstarMES.WEB.Basic.Material.MaterialMasterUpdate.InnerDataBind() in D:\乔虎跃\Work\Project\ArchstarMES\trunk\Archstar.MES.WEB\Basic\Material\MaterialMasterUpdate.aspx.cs:124
ArchstarMES.WEB.Basic.Material.MaterialMasterUpdate.chklstMaterialParameter_SelectedIndexChanged(Object sender, EventArgs e) in D:\乔虎跃\Work\Project\ArchstarMES\trunk\Archstar.MES.WEB\Basic\Material\MaterialMasterUpdate.aspx.cs:88
System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e) +116
System.Web.UI.WebControls.CheckBoxList.RaisePostDataChangedEvent() +133
System.Web.UI.WebControls.CheckBoxList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent() +13
System.Web.UI.Page.RaiseChangedEvents() +132
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1644


版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.32559
...全文
2763 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
XBodhi. 2013-08-19
  • 打赏
  • 举报
回复
没有解决。我的事 64位系统。
qldsrx 2013-08-16
  • 打赏
  • 举报
回复
oldVersion错了啊,版本号只能是一个,你怎么填写了一个范围? oldVersion是你Visual Studio里面添加的那个dll的版本号,编译后,exe程序肯定只认那个版本号,为了兼容其它版本号,才需要转换为newVersion,一般情况下,一个项目里面只可能用到一个版本号,除非你引用的其它dll也用到了但是版本号不同的Oracle.DataAccess.dll,完整的写法如下,你可以尝试<bindingRedirect节点多写一次,反正我没试过。
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess"
        publicKeyToken="89B483F429C47342"
        culture="neutral" />
        <bindingRedirect
          oldVersion="2.112.2.0"
          newVersion="2.112.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
XBodhi. 2013-08-16
  • 打赏
  • 举报
回复
引用 3 楼 qldsrx 的回复:
配置文件举例如下:
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess"
        publicKeyToken="89B483F429C47342"
        culture="neutral" />
        <bindingRedirect
          oldVersion="2.112.2.0"
          newVersion="2.112.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
    <Thread_UseAllCpuGroups enabled="true"/>
    <GCCpuGroup enabled="true"/>
    <gcServer enabled="true"/>
  </runtime>
这是用的11G的客户端,由于10G客户端很多问题,因此不建议使用,而且高版本客户端兼容低版本服务端。 newVersion="2.112.1.0"是11g的64位版本号,而oldVersion="2.112.2.0"是11g的32位版本号,这里oldVersion就用开发用的版本号,而newVersion则使用客户安装的版本号,如果不清楚版本号,可以在注册表里查看,例如使用安装程序在安装时,检测注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\2.112.2.0分支,最后那个就是版本号,动态产生程序配置文件。
我的反射已经可以了,不过参数还是无法对应绑定上 就3个参数的一个删除语句还是无法对应。 用如下代码
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
        <bindingRedirect oldVersion="4.112.0.0-4.112.3.0" newVersion="2.112.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
根本就不起作用。
qldsrx 2013-08-15
  • 打赏
  • 举报
回复
你用反射的目的应该是为了通用化,但是你却针对具体SQL的参数进行反射处理,失去了通用化,适得其反, 建议你参考下Dapper的处理方式。 提示:IDbCommand的CreateParameter方法可以直接创建参数,这部分完全可以不使用反射。
qldsrx 2013-08-15
  • 打赏
  • 举报
回复
参数顺序正确的话,检查下每个输入型参数的值,对于输入参数,为空的话要用DbNull.Value传递进去,而不能传递null,传递null会自动把该参数给忽略,导致缺少了参数。
XBodhi. 2013-08-15
  • 打赏
  • 举报
回复
怎么就没有人能解决吗这个问题。
XBodhi. 2013-08-15
  • 打赏
  • 举报
回复
/*
  功能描述:公共分页存储过程
  编写人:Joe
  编写日期:2013年06月27日
  版权:Copyright © Archstarcn
*/
CREATE OR REPLACE PACKAGE PACKAGE_COMMONPAGING IS
TYPE DATASET IS REF CURSOR;
PROCEDURE PROCEDURE_COMMONPAGING
(
RESULTS OUT DATASET,--返回的结果集合
TOTALRECORDCOUNT OUT INT,--总记录数
TOTALPAGECOUNT OUT INT, --总页数 
PAGEINDEX IN INT,--页索引
PAGESIZE IN INT,--每页的数量
INPUTSQLSTRING IN VARCHAR2,--输入的SQL语句字符串
ORDERBY IN VARCHAR2--要排序的字段名。格式:{Field1 [SortMode(DESC | ASC)]......,n [SortMode(DESC | ASC)]}
);
END PACKAGE_COMMONPAGING;
/
这是包头的类型,
XBodhi. 2013-08-15
  • 打赏
  • 举报
回复


Connection和Command 都可以了。BindBodyName = true也。
就是DataReader时候出问题。
我用的 DataReader 也是基础的。
hangang7403 2013-08-15
  • 打赏
  • 举报
回复
局限于特定数据库不好
XBodhi. 2013-08-15
  • 打赏
  • 举报
回复
 /// <summary>
        /// 方法描述:重写父类创建Command对象的方法
        /// 异常:ArchStar.Framework.Exceptions.DbHelperException
        /// </summary>
        /// <param name="dbConnection">数据库连接对象</param>
        /// <param name="commandType">命令类型 默认:存储过程</param>
        /// <param name="commandText">命令文本</param>
        /// <param name="parameters">命令参数</param>
        /// <returns>数据库命令对象</returns>
        protected override DbCommand CreateDbCommand(DbConnection dbConnection, System.Data.CommandType commandType, StringBuilder commandText, params DbParameter[] parameters)
        {
            DbCommand cmd = null;
            try
            {
                try
                {
                    if (dbConnection.State != ConnectionState.Open)
                        dbConnection.Open();
                }
                catch (InvalidOperationException ex)
                {
                    throw new DbHelperException(ex.Message, ex);
                }
                cmd = factory.CreateInstance<DbCommand>(ManifestConst.ORACLE_DATAACCESS_CLIENT_ORACLECOMMAND);
                using (cmd)
                {
                    cmd.Connection = dbConnection;
                    cmd.CommandType = commandType;
                    cmd.CommandText = commandText.ToString();
                    cmd.CommandTimeout = this.CommandTimeout;
                    SetDbCommandParameters(cmd, parameters);
                    cmd.GetType().GetProperty("BindByName").SetValue(cmd, true, null);
                }
            }
            catch (DbException ex)
            {
                throw new DbHelperException(ex.Message, ex);
            }
            return cmd;
        }
红色就是绑定的,先加参数已经加进去了。BindBodyName 也设置成 true了。 就是DataReader 还是那个问题。
XBodhi. 2013-08-15
  • 打赏
  • 举报
回复
昨天说的你没有看到 BindBodyName 这个代码如下。
      /// <summary>
        /// 方法描述:重写父类创建Command对象的方法
        /// 异常:ArchStar.Framework.Exceptions.DbHelperException
        /// </summary>
        /// <param name="dbConnection">数据库连接对象</param>
        /// <param name="commandType">命令类型 默认:存储过程</param>
        /// <param name="commandText">命令文本</param>
        /// <param name="parameters">命令参数</param>
        /// <returns>数据库命令对象</returns>
        protected override DbCommand CreateDbCommand(DbConnection dbConnection, System.Data.CommandType commandType, StringBuilder commandText, params DbParameter[] parameters)
        {
            DbCommand cmd = null;
            try
            {
                try
                {
                    if (dbConnection.State != ConnectionState.Open)
                        dbConnection.Open();
                }
                catch (InvalidOperationException ex)
                {
                    throw new DbHelperException(ex.Message, ex);
                }
                cmd = factory.CreateInstance<DbCommand>(ManifestConst.ORACLE_DATAACCESS_CLIENT_ORACLECOMMAND);
                cmd.GetType().GetProperty("BindByName").SetValue(cmd, true, null);
                using (cmd)
                {
                    cmd.Connection = dbConnection;
                    cmd.CommandType = commandType;
                    cmd.CommandText = commandText.ToString();
                    cmd.CommandTimeout = this.CommandTimeout;
                    SetDbCommandParameters(cmd, parameters);
                }
            }
            catch (DbException ex)
            {
                throw new DbHelperException(ex.Message, ex);
            }
            return cmd;
        }
qldsrx 2013-08-15
  • 打赏
  • 举报
回复
那你写个测试用的存储过程,输出参数只有游标,不带任何其它参数,看看是否正常。 如果正常-->那就是返回类型不是int的,事实上你也无法指定精度,Oracle里面的number类型是非常大的数字,对应的数据类型用Int64都不为过,而且似乎默认是Decimal类型的。 注意:输出参数的数据类型和精度都很重要,对于String类型,必须设置其字符数,默认字符数为1.
XBodhi. 2013-08-15
  • 打赏
  • 举报
回复
  /// <summary>
        /// 数据库命令参数装载
        /// </summary>
        /// <param name="dbCommand">数据库命令对象</param>
        /// <param name="parameters">数据库命令参数</param>
        protected virtual void SetDbCommandParameters(IDbCommand dbCommand, params IDbDataParameter[] parameters)
        {
            if (dbCommand == null)
                return;
            if (parameters == null || parameters.Length == 0)
                return;
            foreach (var param in parameters)
                dbCommand.Parameters.Add(param);
        }
参数在这里加的。
XBodhi. 2013-08-15
  • 打赏
  • 举报
回复
而且你用 IDbCommand的CreateParameter 你不用反射你就还得用 引用的方式来 进行单个参数的赋值。 反射这面没有问题。值早就都可以了。只是不管用什么方式, 他都提示。上面的错误。 我换其他的方法调用测试的时候 他提示 所有参数未绑定。 BindByName = true了 变量没有空也。
XBodhi. 2013-08-15
  • 打赏
  • 举报
回复
用不用 这个 :IDbCommand的CreateParameter 不是重点。 关键是 不管用什么方式都是那一个错误。
qldsrx 2013-08-14
  • 打赏
  • 举报
回复
引用 5 楼 qiaohuyue 的回复:
不过你那种 方法也可以,但是有问题存在, 如果你引用了 那个Oracle.DataAcess.dll 每次都要编译下,反射动态加载了 ,因为我不想总编译。我写了一个工厂类,完全可以 处理掉了。只是在 调用分页存储过程的时候输出参数是游标,一直抱参数问题。 其他人说,out参数也要赋值才可以,不知道是不是这个问题引起的。
在exe.config里面配置了runtime节点后,就不需要每次都编译了,一次编译后,dll版本更换只要修改配置文件即可。而out参数是不需要赋值的,反射设置值的时候可以这样
parameters[0].GetType().GetProperty("OracleDbType").SetValue(parameters[0], Enum.Parse(oracleDbType,"RefCursor"), null);
XBodhi. 2013-08-14
  • 打赏
  • 举报
回复
DbCommand里 没有 BindByName 但是我可以用反射做到的, 我初始化的是 OracleCommand 对象,BindBodyName = true; 然后我吧 OracleComand 给 DbComand了,因为我那个数据库访问器 是多数据库兼容的,所以就有 基础Command类了, 明天试试你那个 runtime config 如果可以,那就不用反射了。省点事还。 我当初用 config 来着,因为不起作用,我就用反射了。 就 refcursor 在用 datareader读的时候有问题。 其他反射都做了。
XBodhi. 2013-08-14
  • 打赏
  • 举报
回复
不过你那种 方法也可以,但是有问题存在, 如果你引用了 那个Oracle.DataAcess.dll 每次都要编译下,反射动态加载了 ,因为我不想总编译。我写了一个工厂类,完全可以 处理掉了。只是在 调用分页存储过程的时候输出参数是游标,一直抱参数问题。 其他人说,out参数也要赋值才可以,不知道是不是这个问题引起的。
XBodhi. 2013-08-14
  • 打赏
  • 举报
回复
引用 2 楼 qldsrx 的回复:
如果你用Oracle.DataAccess.dll,就必须设置 cmd.BindByName = true; 我没看到有设置这句的地方,错误提示就是你的参数是安装顺序而不是名称进行绑定的。 另外没必要使用反射,而且反射也会导致部分功能无法使用,例如这个BindByName在DbCommand里面是不存在的。 如果要解决Oracle 版本号不一致的问题,很容易,修改配置文件的运行时版本号兼容即可。
DbCommand里 没有 BindByName 但是我可以用反射做到的, 明天我给你贴代码。你就知道了。 我自己写了一个数据库的访问器 公司在用,最初的时候一直用 System.Data.OracleClient 因为参数问题,就换成 Oracle.DataAccess.dll了。因为我的目的是 不需要别人去因为我的 Accessor 所以就用反射了。 因为 oracle x64 和 x86 客户的服务器配置不一定还。就用反射了。
qldsrx 2013-08-14
  • 打赏
  • 举报
回复
配置文件举例如下:
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess"
        publicKeyToken="89B483F429C47342"
        culture="neutral" />
        <bindingRedirect
          oldVersion="2.112.2.0"
          newVersion="2.112.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
    <Thread_UseAllCpuGroups enabled="true"/>
    <GCCpuGroup enabled="true"/>
    <gcServer enabled="true"/>
  </runtime>
这是用的11G的客户端,由于10G客户端很多问题,因此不建议使用,而且高版本客户端兼容低版本服务端。 newVersion="2.112.1.0"是11g的64位版本号,而oldVersion="2.112.2.0"是11g的32位版本号,这里oldVersion就用开发用的版本号,而newVersion则使用客户安装的版本号,如果不清楚版本号,可以在注册表里查看,例如使用安装程序在安装时,检测注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\2.112.2.0分支,最后那个就是版本号,动态产生程序配置文件。
加载更多回复(2)

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧