0

我们真的迷失了这一点,阅读了 ODP.NET 2 Day+ 开发人员指南并没有帮助。我已经提供了函数定义(存储在一个包中),我不明白我们必须将数据集转换为什么或传递函数的内容。这是函数定义:

FUNCTION ins (
rec_data IN OUT schema.table%ROWTYPE,
p_rowid OUT ROWID,
p_execution_ts IN schema.table.update_ts%TYPE)
RETURN NUMBER

这是我们所做的(什么都不做):

// inserts data

public void insertData(DataSet Data) 
{ 
string connStr = "DATA SOURCE=someValidConnString"; 
OracleConnection conn = new OracleConnection(connStr); 
string rowID = String.Empty; 
Int32 rtnVal = 0; 
try 
{ 
conn.Open(); 
OracleCommand insCmd = new OracleCommand("PACKAGE.ins", conn); 
insCmd.CommandType = CommandType.StoredProcedure; 
OracleParameter outParam2 = new OracleParameter("retVal", OracleDbType.Varchar2,     rtnVal, 

ParameterDirection.ReturnValue); 
insCmd.Parameters.Add(outParam2); //return value 
OracleParameter inParam1 = new OracleParameter("rec_data", OracleDbType.NVarchar2,     dsACCTData.Tables

[0].Rows[0], ParameterDirection.InputOutput); 
OracleParameter outParam = new OracleParameter("p_rowid", OracleDbType.Varchar2, rowID, 

ParameterDirection.Output); 
OracleParameter inParam2 = new OracleParameter("p_execution_ts", OracleDbType.Date, 

Oracle.DataAccess.Types.OracleDate.GetSysDate(), ParameterDirection.Input); 
insCmd.Parameters.Add(inParam1);  //first in out parameter 
insCmd.Parameters.Add(outParam);  //second out parameter 
insCmd.Parameters.Add(inParam2);  //third in parameter 


insCmd.ExecuteNonQuery(); 
conn.Close(); 

} 
catch (OracleException ee) 
{ 
throw ee; 
} 
finally 
{ 
conn.Dispose(); 

} 
}

我知道这是一个非常具体的问题,但我真的迷路了。让我们假设 Oracle 函数 ins 工作(它确实),在这种情况下,我们根本不知道如何使用 ODP.NET 正确调用它

非常感谢您的帮助。

编辑:这是错误消息:

ORA-06550:第 1 行,第 15 列:PLS-00306:调用“INS”时参数的数量或类型错误 ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略

亲切的问候,河豚

4

2 回答 2

1

每件事看起来都不错。但是您必须检查所有属性名称和属性类型。

在您的示例中有错误的数据类型 OracleDbType.Varchar2,因为您的函数返回 Number(在您的 Oracle 函数定义中)

OracleParameter outParam2 = new OracleParameter("retVal", OracleDbType.Varchar2, rtnVal, ParameterDirection.ReturnValue);

insCmd.Parameters.Add(outParam2); //返回值

于 2011-05-30T10:39:05.673 回答
1

也许这会有所帮助:

http://www.c-sharpcorner.com/UploadFile/john_charles/CallingOraclestoredproceduresfromMicrosoftdotNET06222007142805PM/CallingOraclestoredproceduresfromMicrosoftdotNET.aspx

我正在寻找相同的答案,我想我找到了一些东西。第二行有输出变量的示例。

objCmd.Parameters.Add("pin_deptno", OracleType.Number).Value = 20;
objCmd.Parameters.Add("pout_count", OracleType.Number).Direction = ParameterDirection.Output;

希望该链接能起到任何作用。

问候,米

于 2011-01-25T13:46:57.163 回答