您的位置:首页 > 数据库 > Oracle

利用Oracle.DataAccess调用Function的遇到的一个诡异问题

2012-01-18 14:21 225 查看
这是一段很简单的Function,(随便举个例子)

FUNCTION Execute(message_id_ IN OUT NUMBER,
part_no_ IN OUT VARCHAR2) RETURN VARCHAR2 IS
BEGIN
//这里,接收message_id_参数,做某些处理 part_no_ :='123456';
RETURN 'test';
END Execute;

以前是采用微软不再支持的System.Data.OracleClient命名空间,如下:

var connectionString = "xxxx";

OracleConnection conn = new OracleConnection(connectionString);

conn.Open();
OracleCommand cmd = new OracleCommand("TEST.TESTAB.Execute", conn);
cmd.CommandType = CommandType.StoredProcedure;cmd.Parameters.Add("message_id_", OracleType.Int32);cmd.Parameters[0].Direction = ParameterDirection.InputOutput;cmd.Parameters.Add("part_no_", OracleType.VarChar, 100);cmd.Parameters[1].Direction = ParameterDirection.InputOutput;cmd.Parameters.Add("result_", OracleType.VarChar, 2000);cmd.Parameters[2].Direction = ParameterDirection.ReturnValue;cmd.Prepare();

cmd.Parameters[0].Value = 10000;

cmd.ExecuteNonQuery();

以上代码能正确赋值和返回结果,但是后来程序给到别人改,他采用了Oracle公司为.NET专门开发的Oracle.DataAccess.dll,采用以上方法死活得不到传入值message_id_,而必须将返回参数值作为第一个参数才行,如下,而采用ADO.NET是没有这样的顺序限制的。

var connectionString = "xxxx";OracleConnection conn = new OracleConnection(connectionString);

conn.Open();
OracleCommand cmd = new OracleCommand("TEST.TESTAB.Execute", conn);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("result_", OracleType.VarChar, 2000);cmd.Parameters[0].Direction = ParameterDirection.ReturnValue;

cmd.Parameters.Add("message_id_", OracleType.Int32);
cmd.Parameters[1].Direction = ParameterDirection.InputOutput;
cmd.Parameters.Add("part_no_", OracleType.VarChar, 100);
cmd.Parameters[2].Direction = ParameterDirection.InputOutput;

cmd.Prepare();

cmd.Parameters[1].Value = 10000;

cmd.ExecuteNonQuery();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐