ODP.NET 2.0使用注意事项以及与1.0的区别

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值