C# DataTable, in Oracle Gespeicherten Prozedur
Was ich tun müssen, ist, übergeben Sie eine C# DataTable in eine gespeicherte Oracle-Prozedur.
Hier ist, was ich getan habe:
Oracle-Seite:
-
Erstellt eine Art:
create or replace TYPE CUSTOM_TYPE AS OBJECT ( attribute1 VARCHAR(10), attribute2 VARCHAR(10) );
-
Erstellt eine Tabelle
create or replace TYPE CUSTOM_TYPE_ARRAY AS TABLE OF CUSTOM_TYPE;
-
Erstellt eine gespeicherte Prozedur
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# Seite:
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();
}
Aber ich erhalte eine Fehlermeldung:
Ungültiger parameter verbindliche Parameter name: P_TABLE_IN
HILFE!
- Scheint dies nicht direkt - das CodeProject-Artikel zeigt eine mögliche Problemumgehung die Verwendung von XML
- Die unbequeme mit dem Code-Projekt verlinkten Artikel oben ist, dass Sie brauchen, um erstellte Tabelle für Ihre Daten-Struktur, was bedeutet, weniger Flexibilität.
Du musst angemeldet sein, um einen Kommentar abzugeben.
DataTable nicht gebunden werden kann direkt. Sie müssen erstellen Sie benutzerdefinierte Klasse für jedes der UDT, die Sie zugreifen möchten, aus .NET. Hier habe ich einfach das Beispiel, wie anzeigen in einer halben generischen DataTable zu UDT:
Funktion ConvertDataTypeToUdt generisch ist und wenn Sie entsprechende Klasse es ordnet die Daten einer Tabelle automatisch. Im nächsten Schritt wäre zu automatisieren Sie die Zuordnung vollständig, so dass das Ziel-Datentyp definiert, indem die Daten der Tabelle selbst. Die 'HUSQVIK' in benutzerdefinierten type-Attribute ist der name des Schemas, und es müssen entsprechend Ihrer Datenbank, wenn Sie nicht eine Verbindung als Besitzer der schema mit dem benutzerdefinierten Typen.