嗨,我在Oracle 11g服务器上调用存储过程有问题.
这是我的存储过程
PROCEDURE get_rit_by_user_id(KDC_KEY IN VARCHAR2,
p_id_utente IN NUMBER,
p_cur_out OUT type_cursor) IS
BEGIN
...
...
...
END
Run Code Online (Sandbox Code Playgroud)
这是我的c#代码
OracleCommand cmd = new OracleCommand();
cmd.Connection = oracleConnection;
cmd.CommandText = userIdEsercizio + packageName + "GET_RIT_BY_USER_ID";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("KDC_KEY", OracleDbType.Varchar2, kdcKey, ParameterDirection.Input);
cmd.Parameters.Add("P_ID_UTENTE", OracleDbType.Int32, user_id, ParameterDirection.Input);
cmd.Parameters.Add("P_CUR_OUT", OracleDbType.RefCursor, ParameterDirection.Output);
OracleDataReader reader = cmd.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)
cmd.ExecuteReader()抛出此异常
PROCEDURE get_rit_by_user_id(KDC_KEY IN VARCHAR2,
p_id_utente IN NUMBER,
p_cur_out OUT type_cursor) IS
BEGIN
...
...
...
END
Run Code Online (Sandbox Code Playgroud)
我在c#代码中看不出任何错误.你会帮我吗?谢谢
最好的祝福
你的第二个参数是a NUMBER,而不是整数.将第二个参数类型更改为OracleDbType.Decimal
http://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm
还要检查Add方法的语法.现在可能更好地更明确地指定参数属性,即使它使代码更加冗长:
cmd.Parameters.Add(
new OracleParameter()
{
ParameterName="KDC_KEY",
DbType=OracleDbType.Varchar2,
Value=kdcKey,
Direction=ParameterDirection.Input
}
);
Run Code Online (Sandbox Code Playgroud)
等等
proc 除了光标还返回结果集吗?如果不使用ExecuteNonQuery而不是Execute
输入参数最常见的问题是null.如果kfcKey或者user_id是null(或者是空引用,或Nullable<T>没有值),那么对于许多供应商(我假设,因此甲骨文太)它不会增加该参数.要通过null,你通常需要通过DBNull.Value.
所以:检查nulls.
cmd.Parameters.Add("KDC_KEY", OracleDbType.Varchar2,
(object)kdcKey ?? DBNull.Value, ParameterDirection.Input);
cmd.Parameters.Add("P_ID_UTENTE", OracleDbType.Int32,
(object)user_id ?? DBNull.Value, ParameterDirection.Input);
Run Code Online (Sandbox Code Playgroud)