我正在尝试参数化所有现有的sql,但以下代码给我一个问题:
command.CommandText = String.Format("SELECT * FROM({0})
WHERE ROWNUM <= :maxRecords", command.CommandText);
command.Parameters
.Add("maxRecords", OracleType.Int32).Value = maxRecords;
报告的错误是“ORA-01036:非法变量名称/编号”。
我认为这是因为OracleType.Int32不是ROWNUM的正确数据类型。那是什么?
答案 0 :(得分:6)
在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)
答案 1 :(得分:1)
如果数据类型有问题,我相信OracleType.Number
会有效。
答案 2 :(得分:1)
好问题。你试过了吗:OracleType.UInt32?我会尝试将OracleType.Number作为最后的手段。
答案 3 :(得分:0)
对不起大家,问题不在于数据类型。这是因为在方法代码中多次使用命令对象来运行具有不同参数的不同sql。在我的调用之后调用command.Parameters.Clear()对问题进行排序。非常感谢您对如何查找DataType的深入了解。它将有助于进一步参考。
答案 4 :(得分:-2)
您需要将OracleType.RowID用于Oracle rowID。他们不是数字。
http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracletype.aspx
这表明:
。的base64字符串表示形式 Oracle ROWID数据类型。使用.NET Framework String或OracleClient Oracle中的OracleString数据类型。