1. c# 调用存储过程传递参数时,参数的顺序必须和数据库中存储过程的参数顺序一致。
2. 参数为ParameterDirection.Output必须指定大小。如
OracleParameter
pout1= new OracleParameter("v_reason", OracleDbType.Varchar2, 50);
3. 数组的参数类型为OracleCollectionType.PLSQLAssociativeArray,且必须明确指定数据元素的个数。如:
OracleParameter v_OIDS = new OracleParameter("v_OIDS", OracleDbType.Int64);
v_OIDS.Direction = ParameterDirection.Output;
v_OIDS.Size = 10;
v_OIDS.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
4. 当参数类型是ParameterDirection.Output,调用存储过程后,判断输出参数值是否为null以及转化成c#数据类型的注意事项:
OracleParameter
pout1 = new OracleParameter("v_reason", OracleDbType.varchar2, 50);
pout1.Direction = ParameterDirection.Output;
DataBaseHelper.RunProcedure("PRC_CON_sysuserlogin", new IDataParameter[] { pin1, pin2 }, pout1);
直接用pout1.Value==null 是无效的,必须先将其转化为Oracle.DataAccess.Types中的数据类型,然后用Oracle.DataAccess.Types中的数据类型的IsNull属性来判断。如:
b
ool
bIsnull = ((Oracle.DataAccess.Types.OracleString)pout1.Value).IsNull;
转化成c#的数据类型时不能直接用Convert方法和Parase方法,必须转化成Oracle.DataAccess.Types中的数据类型,然后调用向对应的房发.Toxxxx()或者先ToString(),然后在转化。如
OracleParameter
pout3 = new OracleParameter("age",OracleDbType.Int32,ParameterDirection.Output);
...
int age = ((Oracle.DataAccess.Types.OracleDecimal)pout3.Value).ToInt32();
或者
int age = int.Parase(pout3.Value.ToString());
5.
输出数组的遍历方法:
如果输出参数类型是数组类型,遍历数组中各个元素的方法:
OracleParameter
v_OIDS = new OracleParameter("v_OIDS", OracleDbType.Int64);
v_OIDS.Direction = ParameterDirection.Output;
v_OIDS.Size = 10;
v_OIDS.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
for
(int i=0;i< 10;i++)
{
long a = ((Oracle.DataAccess.Types.OracleDecimal[])v_OIDS.Value)[i].ToInt64();
}
或者
for
(int i = 0; i < 10; i++)
{
long a = ((Oracle.DataAccess.Types.OracleDecimal)(v_OIDS.Value as Array).
GetValue(i)
).ToInt64();
}
6.
在调用存储过程时,如果输入参数为数组,则长度不能为0,数组也不能为null