2012-11-28 15 views
5

Jak prawidłowo wykonać następującą aktualizację:Jakie jest najlepsze podejście do wykonywania wielu instrukcji UPDATE w jednym połączeniu?

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(); 
} 

jestem świadomy wszystko albo nic jeśli jest to transakcja, ale po prostu zobaczyć, jak to działa z prawidłowym podejściem.

Myślę, że iteracji tablicy elementów [sql1, sql2, sql3, sql4] i przekazać sql (#) w CommandText i wykonywać ExecuteNonQuery za każdym razem.

+0

Nie ma nic złego w ty opisują podejście , z wyjątkiem twoich ciągów sql nie "zakończonych" – Igor

+0

To dziwne ... kod sytax stlye musiał zmienić mój blok kodu, naprawię go, Thx za informację zwrotną Xander – ombinar

+0

Zmieniłem twój tytuł. [Czy w tytułach powinny się znaleźć "znaczniki"?] (Http://meta.stackexchange.com/questions/19190/) ", gdzie konsensus brzmi" nie, nie powinien ". –

Odpowiedz

7

Jeśli dobrze pamiętam, możliwe jest łączenie wielu instrukcji SQL w jeden ciąg rozdzielony średnikami (;). W przeciwnym razie nie ma nic złego w wykonywaniu wielu połączeń ExecuteNonQuery().

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

Twoje rozwiązanie działa dobrze z niewielkimi zmianami, aby działało: 1) Dodaj: BEGIN przed pierwszą aktualizacją (tak "string sql1 =" BEGIN update ... " 2) Dodaj: END; na samym końcu w oświadczeniu przesłanym (tak "..." benz "; END;"; 3) Musiałem odwrócić OracleCommand (sql, conn), który nie ma wielkiego znaczenia Dziękuję wszystkim za pomoc we właściwym kierunku. był bardzo pomocny! – ombinar

+0

Dziękuję za informację zwrotną, właśnie to napisałem z pamięci. Mam nadzieję, że inni też mogą ją znaleźć –

1

Innym podejściem jest stworzyć prostą metodę rozszerzenia (ExecuteMultipleNonQuery), które po prostu dzieli ciąg na wszystkich średników i wykonuje każdą instrukcję w pętli:

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(); 
     } 
    } 

} 
Powiązane problemy