2009-07-10 17 views
2

Ich benutze eine ExecuteOracleNonQuery in C#, um einen Datensatz in meine Oracle-Datenbank mit einer gespeicherten Prozedur einfügen, aber nicht scheinen die ROWID zurückzukehren.Wie bekomme ich die Rowid von einem ExecuteOracleNonQuery in C#

In C# ...

using (OracleConnection oc= 
    new OracleConnection(AppConfiguration.ConnectionString)) 
{ 
    OracleCommand myCommand = new OracleCommand("PKG_TEST.INSERT", oc); 
    myCommand.CommandType = CommandType.StoredProcedure; 
    myCommand.Parameters.AddWithValue("p_Id", allAssets.Id); 
    myCommand.Parameters.AddWithValue("p_Description", allAssets.Description); 
    OracleString rowId; 
    try 
    { 
     myConnection.Open(); 
     result = myCommand.ExecuteOracleNonQuery(out rowId); 
     allAssets.RowId = rowId.ToString(); 
    } 
    catch(System.Exception ex) 
    { 
     Console.WriteLine(ex.StackTrace); 
    } 
    finally 
    { 
     myConnection.Close(); 
    } 
} 
return result; 

Verfahren in Oracle-Paket ...

PROCEDURE insert (
    p_id    IN ALL_ASSETS.id%TYPE, 
    p_description  IN ALL_ASSETS.description%TYPE 
) 
IS 
BEGIN 
    INSERT INTO ALL_ASSETS 
       (id, description) 
     VALUES (p_id, p_description); 
END insert; 

Kann jemand Aufschluss über, wie die ROWID zurückgegeben wird, bitte?

EDIT - Ich habe jetzt den Code geändert, um wie oben zu sein, aber immer noch keine ROWID zurückgeben. Außerdem wird nur ein Datensatz eingefügt.

Danke.

Antwort

1

Hmmm, müssen Sie eigentlich die Rowid als out-Parameter in Ihrer gespeicherten Prozedur angeben? Ich dachte, dass ExecuteOracleNonQuery es automatisch als C# out-Variable zurückgegeben hat.

+0

Das ist, was ich dachte, weshalb ich es ursprünglich nicht erklärt hatte. Ich bekam jedoch immer noch nichts zurück. –

+0

Sind Sie absolut sicher, dass der SP genau 1 Reihe betrifft; die Dokumentation schlägt vor, dass es möglicherweise nicht zurückgegeben wird, wenn nicht ... – Calanus

+0

Ja, ich habe es durch verfolgt und nur ein Datensatz wird eingefügt. –

2

Warum würden Sie erwarten, dass es eine Rowid zurückgibt? Nein, wo im DB-Ende haben Sie es gefragt, und Prozedur wird nicht eine ROWID zurückgeben und würde nicht wissen, welche sowieso zurückgeben.

Das automatische Zurückgeben der ROWID der betroffenen Zeilen kann für INSERT/UPDATE/MERGE und vielleicht DELETE funktionieren (obwohl ich mir in diesem Fall nicht sicher bin).

Sie können verwenden INSERT INTO ALL_ASSETS (ID, Beschreibung) VALUES (p_id, p_description) RETURNING ROWID IN v_rowid;

v_rowid wäre eine Variable in PL/SQL und Sie könnten sie als zusätzlichen out-Parameter aus der Datenbank zurückgeben oder die Prozedur in eine Funktion konvertieren.

+0

Danke für die Info, Gary. Ich habe versucht, es selbst als out-Parameter zurückgeben, aber ohne Erfolg (Original-Code veröffentlicht hatte dies). C# hat ein out-Schlüsselwort, mit dem in diesem Fall die rowid zurückgegeben wird. Von MSDN: "ExecuteOracleNonQuery unterscheidet sich von ExecuteNonQuery dadurch, dass es Rowid als Ausgabeparameter zurückgibt, wenn Sie eine INSERT-, DELETE- oder UPDATE-Anweisung ausführen, die genau eine Zeile betrifft. Dadurch können Sie eine Zeile im Oracle eindeutig identifizieren Datenbank, mit der Sie die Leistung bei nachfolgenden verwandten Abfragen erhöhen können. " Allerdings erwähnen sie nicht, wie das zurückgegeben wird! –

Verwandte Themen