使用托管ODP.NET使用OracleCommand(C#)参数化ROWNUM的问题

时间:2015-10-27 17:36:41

标签: c# oracle odp.net ora-01008

尝试使用最新的ODP.NET托管驱动程序查询Oracle数据库时,我尝试参数化ROWNUM。

SQL查询是“...... WHERE ROWNUM< =:ROWSTOLOCK”

当我尝试将ROWNUM添加为参数时,如下所示:

dbCommand.Parameters.Add("ROWSTOLOCK", Oracle.ManagedDataAccess.Client.OracleDbType.Int64, 25 , ParameterDirection.Input);

我尝试执行查询

dbCommand.ExecuteNonQuery() 

我得到一个例外:

“附加信息:ORA-01008:并非所有变量都绑定”

行数是我们在之前的Stack Overflow帖子中可以看到的数字:What is the OracleType of ROWNUM

但是我找不到Oracle.ManagedDataAccess.Client.OracleDbType.Number。我尝试了Oracle.ManagedDataAccess.Client.OracleDbType枚举中可用的所有其他数字类型。

我发现很难想到这是托管驱动程序的限制(数字类型不可用)。

代码段:

        string sql = "...WHERE  ROWNUM & lt;= :ROWSTOLOCK";
        string connectionString = "my connection string";
        Oracle.ManagedDataAccess.Client.OracleConnection connectiont = new Oracle.ManagedDataAccess.Client.OracleConnection(connectionString);

        Oracle.ManagedDataAccess.Client.OracleCommand dbCommand = new Oracle.ManagedDataAccess.Client.OracleCommand(sql, connectiont);
        dbCommand.Parameters.Add("ROWSTOLOCK", Oracle.ManagedDataAccess.Client.OracleDbType.Decimal, 25, ParameterDirection.Input);
        connectiont.Open();
        int rowsAffected = dbCommand.ExecuteNonQuery();

完成例外:

ORA-01008: not all variables bound
Oracle Data Provider for .NET, Managed Driver
       at OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone)
       at 
OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean bFirstIterationDone)
       at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, OracleException& exceptionForArrayBindDML, Boolean isFromEF)
       at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()
       at QuickTest1.Program.Main(String[] args) in C:\Users\george\Documents\Visual Studio 2015\Projects\Program.cs:line 44
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()

真心感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

无法编译代码段。您使用dbCommand引用,并在声明后使用line。您还要添加参数,然后实例化OracleCommand的新实例。所以命令没有任何参数。然后我希望它在ORA-01745上失败:无效的主机/绑定变量名称,因为ROWNUM是保留字。