日期:2014-05-19  浏览次数:21020 次

c#中编写Oracle的SQL语句命令并传递参数的问题.
最近才用oracle,发生了点问题

连接等用的是Oracle.DataAccess.Client类

以下是对同一份表(MEMBER)的操作,ID是NUMBER(10),MEMBERNAME是VARCHAR2(50)

DB   db   =   new   DB();
OracleParameter[]   OraParams   =   new   OracleParameter[1];
OraParams[0]   =   new   OracleParameter( "ID ",   OracleDbType.Int32,   10,   2,   ParameterDirection.Input);
DataTable   dt   =   db.GetRecord( "select   *   from   et_member   where   ID   =   :ID ",   OraParams);

这样的查询语句,是正常的,能查出正确的结果.

然而
DB   db   =   new   DB();
OracleParameter[]   OraParams   =   new   OracleParameter[2];
OraParams[0]   =   new   OracleParameter( "ID ",   OracleDbType.Int32,   2,   10,   ParameterDirection.Input);
OraParams[1]   =   new   OracleParameter( "MemberName ",   OracleDbType.Varchar2,   50,   "xxxy ",   ParameterDirection.Input);
db.ExecuteNonQuery( "update   et_member   set   MemberName=:MemberName   where   ID   =   :ID ",   OraParams);

这样写的语句,却报ORA01722   无效数字错误.

如果两个参数都是字符串(当然WHERE里要修改),程序就又没有错了.怎么回事?是NUMBER对应的类型问题还是什么问题?

------解决方案--------------------
看下下是不是参数顺序的问题,这样改一下:

DB db = new DB();
OracleParameter[] OraParams = new OracleParameter[2];
OraParams[0] = new OracleParameter( "MemberName ", OracleDbType.Varchar2, 50, "xxxy ", ParameterDirection.Input);
OraParams[1] = new OracleParameter( "ID ", OracleDbType.Int32, 2, 10, ParameterDirection.Input);
db.ExecuteNonQuery( "update et_member set MemberName=:MemberName where ID = :ID ", OraParams);

可能Oracle的参数只是使用占位符,而不是命名参数。就是按位置顺序来匹配。
------解决方案--------------------
参数顺序的问题,占位符用?即可