Я пытаюсь параметризовать весь наш существующий sql, но следующий код дает мне проблему:
command.CommandText = String.Format("SELECT * FROM({0})
WHERE ROWNUM <= :maxRecords", command.CommandText);
command.Parameters
.Add("maxRecords", OracleType.Int32).Value = maxRecords;
Ошибкой, о которой сообщают, являются "РТЫ 01036: недопустимое имя переменной / число".
Я предполагаю, что это вызвано тем, что OracleType. Int32 не является правильным типом данных для ROWNUM. Таким образом, что это?
В SQLPlus мы можем создать вид, включающий rownum
, чтобы увидеть, какой именно тип данных использует Oracle:
TEST>create view v_test as select rownum rn, dummy from dual;
View created.
TEST>desc v_test
Name Null? Type
-------- -------- -------------
RN NUMBER
DUMMY VARCHAR2(1)
Так что для Oracle эта псевдоколонка - это число. Которое на основе этой ссылки ( http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#i16209) может содержать:
The following numbers can be stored in a NUMBER column:
-Positive numbers in the range 1 x 10^-130 to 9.99...9 x 10^125 with up to 38 significant digits
-Negative numbers from -1 x 10^-130 to 9.99...99 x 10^125 with up to 38 significant digits
-Zero
-Positive and negative infinity (generated only by importing from an Oracle Database, Version 5)
Извините всех, проблема не в типе данных, а в том, что объект команды используется в коде метода не один раз для выполнения разных sql, с разными параметрами. Вызов command.Parameters.Clear() после того, как я отсортировал проблему. Большое спасибо за понимание того, как найти DataType. Будет полезно для дальнейшего изучения.
.Для идентификаторов рядов Oracle необходимо использовать OracleType.RowID. Это не числа.
http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracletype.aspx
Это означает:
Строковое представление base64 для Тип данных Oracle ROWID. Использовать .NET Рамочная струна или OracleClient Тип данных OracleString в Value.
] Я полагаю, что []OracleType.Number[
] будет работать, если тип данных является проблемой.[
Хороший вопрос. Вы пробовали: OracleType.UInt32? Я бы попробовал OracleType.Number в крайнем случае.