【发布时间】:2015-10-31 16:00:07
【问题描述】:
我需要做的是将 C# DataTable 传递给 Oracle 存储过程。
这是我所做的:
Oracle 方面:
-
创建了一个类型:
create or replace TYPE CUSTOM_TYPE AS OBJECT ( attribute1 VARCHAR(10), attribute2 VARCHAR(10) ); -
创建了一个表
create or replace TYPE CUSTOM_TYPE_ARRAY AS TABLE OF CUSTOM_TYPE; -
创建了一个存储过程
create or replace PROCEDURE SP_TEST ( P_TABLE_IN IN CUSTOM_TYPE_ARRAY, P_RESULT_OUT OUT SYS_REFCURSOR ) AS --P_TABLE_IN CUSTOM_TYPE_ARRAY; BEGIN OPEN P_RESULT_OUT FOR SELECT attribute1, attribute2 FROM TABLE(P_TABLE_IN); END SP_TEST;
C#端:
void Run()
{
OracleConnection oraConn = new OracleConnection();
oraConn.ConnectionString = ConfigurationManager.ConnectionStrings["NafasV2ConnectionString"].ToString();
DataSet dataset = new DataSet();
DataTable Dt = new DataTable();
OracleDataAdapter da = new OracleDataAdapter();
OracleCommand cmd = new OracleCommand();
try
{
FormTVP(ref Dt);
PopulateTVP(ref Dt);
oraConn.Open();
cmd.Connection = oraConn;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "SP_TEST";
OracleParameter parm1 = new OracleParameter("P_TABLE_IN", OracleDbType.RefCursor,100,"xx");
parm1.Value = Dt;
parm1.Direction = ParameterDirection.Input;
cmd.Parameters.Add(parm1);
OracleParameter parm2 = new OracleParameter("P_RESULT_OUT", OracleDbType.RefCursor);
parm2.Direction = ParameterDirection.Output;
cmd.Parameters.Add(parm2);
da.SelectCommand = cmd;
da.Fill(dataset);
ASPxLabel1.Text = "OK!!";
}
catch (Exception ex)
{
ASPxLabel1.Text = "DIE. REASON: " + ex.Message;
}
finally
{
da.Dispose();
cmd.Dispose();
oraConn.Close();
oraConn.Dispose();
}
}
void FormTVP(ref DataTable Dt)
{
DataColumn attribute1 = Dt.Columns.Add("ATTRIBUTE1", typeof(String));
DataColumn attribute2 = Dt.Columns.Add("ATTRIBUTE2", typeof(String));
Dt.AcceptChanges();
}
void PopulateTVP(ref DataTable Dt)
{
DataRow Dr = Dt.NewRow();
Dr["ATTRIBUTE1"] = "MK1";
Dr["ATTRIBUTE2"] = "MK2";
Dt.Rows.Add(Dr);
DataRow Dr1 = Dt.NewRow();
Dr1["ATTRIBUTE1"] = "HH1";
Dr1["ATTRIBUTE2"] = "HH2";
Dt.Rows.Add(Dr1);
Dt.AcceptChanges();
}
但我收到一个错误:
无效的参数绑定参数名称:P_TABLE_IN
帮助!
【问题讨论】:
-
看来你不能直接这样做 - this CodeProject article 显示了使用 XML 的可能解决方法
-
上面链接的代码项目文章的不便之处在于您需要为您的数据结构创建表,这意味着灵活性较低。
标签: c# oracle stored-procedures