2012-11-28 2 views
5

Wie das folgende Update richtig tun:Whatis ist der beste Ansatz zum Ausführen mehrerer UPDATE-Anweisungen in einer Verbindung?

using (OracleConnection conn = new OracleConnection()) 
using (selCmd) 
{ 

    string sql1 = "update Table1 set name = joe where id = 10;" 
    string sql2 = "update Table2 set country = usa where region = americas;" 
    string sql3 = "update Table3 set weather = sunny where state = CA;" 
    string sql4 = "update Table4 set engine = v8 where maker = benz;" 

    cmdUpdate.CommandText = sql(#); 
    cmdUpdate.Connection = conn; 
    recs = cmdUpdate.ExecuteNonQuery(); 
} 

Ich bin mir bewusst, alles oder nichts, wenn es sich um eine Transaktion, aber ich nur um zu sehen, wie es mit den richtigen Ansatz funktioniert.

Ich denke, iterieren Sie ein Array von Elementen [sql1, sql2, sql3, sql4] und übergeben Sie sql (#) im CommandText und führen Sie ExecuteNonQuery jedes Mal.

+0

Es gibt nichts mit dem Ansatz falsch ist, dass Sie beschreiben , außer für Ihre SQL-Zeichenfolgen nicht "beendet. – Igor

+0

Das ist seltsam ... der Code sytax stlye muss meinen Code-Block geändert haben. Ich werde es beheben. Thx für das Feedback Xander. – ombinar

+0

Ich habe Ihren Titel bearbeitet. Bitte sehen Sie," [Sollten Fragen "Tags" in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/) ", wo der Konsens" nein, th Sie sollten nicht ". –

Antwort

7

Wenn ich mich richtig erinnere, ist es möglich, mehrere SQL-Anweisungen in einer Zeichenfolge durch Semikolons (;) getrennt zu verketten. Ansonsten ist nichts Falsches daran, mehrere ExecuteNonQuery() Aufrufe auszuführen.

string sql1 = "BEGIN update Table1 set name = 'joe' where id = 10;", 
     sql2 = "update Table2 set country = 'usa' where region = 'americas';", 
     sql3 = "update Table3 set weather = 'sunny' where state = 'CA';", 
     sql4 = "update Table4 set engine = 'v8' where maker = 'benz'; END;"; 

string sql = string.Format("{0}{1}{2}{3}",sql1,sql2,sql3,sql4); 

using (OracleConnection conn = new OracleConnection()) 
using (OracleCommand cmdUpdate = new OracleCommand(sql, conn)) 
{ 
    conn.Open(); 
    recs = cmdUpdate.ExecuteNonQuery(); 
} 
+3

Ihre Lösung funktioniert gut mit geringfügiger Anpassung, damit es funktioniert: 1) Hinzufügen: BEGIN vor dem allerersten UPDATE (also "String sql1 =" BEGIN update ... " 2) Hinzufügen: END; ganz am Ende der veralteten Aussage (so "... 'benz'; ENDE;"; 3) Ich musste OracleCommand (sql, conn) umkehren, was keine große Sache ist Danke euch allen, dass ihr mir geholfen habt, in die richtige Richtung zu kommen war sehr hilfreich! – ombinar

+0

Danke für das Feedback.Ich habe das nur aus dem Gedächtnis geschrieben.Hoffnung, dass andere es auch nützlich finden können –

1

Ein weiterer Ansatz ist es, eine einfache Erweiterung Methode (ExecuteMultipleNonQuery), die einfach teilt den String auf alle Semikolons zu erstellen und jede Anweisung in einer Schleife ausführt:

public static class DbCommandExtensions { 

    public static void ExecuteMultipleNonQuery(this IDbCommand dbCommand) 
    { 
     var sqlStatementArray = dbCommand.CommandText.Split(new string[] {";"}, StringSplitOptions.RemoveEmptyEntries); 
     foreach (string sqlStatement in sqlStatementArray) 
     { 
      dbCommand.CommandText = sqlStatement; 
      dbCommand.ExecuteNonQuery(); 
     } 
    } 

} 
Verwandte Themen