Проблема с параметризацией ROWNUM с использованием OracleCommand (C#) с использованием управляемого ODP.NET

Я пытаюсь параметризовать ROWNUM при запросе базы данных Oracle с использованием последней версии управляемого драйвера ODP.NET.

SQL-запрос "... ГДЕ ROWNUM <=:ROWSTOLOCK"

Когда я пытаюсь добавить ROWNUM в качестве параметра, как показано ниже:

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

и я пытаюсь выполнить запрос

dbCommand.ExecuteNonQuery() 

Я получаю исключение:

"Дополнительная информация: ORA-01008: не все переменные связаны"

Число строк - это число, которое мы видим в предыдущем сообщении о переполнении стека. Что такое OracleType для 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 ответ

Фрагмент не может быть скомпилирован. Вы используете ссылку dbCommand и просто строку после ее объявления. Также вы добавляете параметр, а затем создаете экземпляр нового экземпляра OracleCommand. Таким образом, команда не имеет параметров. И тогда я ожидаю, что это произойдет на ORA-01745: недопустимое имя переменной host/bind, потому что ROWNUM - зарезервированное слово.

Другие вопросы по тегам