Laden...

mehrere Sql-Statements gleichzeitig innerhalb Transaktion durchführen

Erstellt von sharp.new vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.908 Views
S
sharp.new Themenstarter:in
100 Beiträge seit 2006
vor 17 Jahren
mehrere Sql-Statements gleichzeitig innerhalb Transaktion durchführen

Hallo zusammen,
kurzer Projekthintergrund: Ich habe ein ArrayList mit SQL-Parametern und eine ArrayList mit den Values. Mit command.Parameters.AddWithValue füge ich beide zusammen. Dieses möchte ich solange durchführen bis das Value-Arraylist durch ist. ANschliessend innerhalb einer Transaktion n SQL-Abfragen durchführen.

Mein Code funktioniert bei einem Value-Satz, sobald mehrere Values anstehen kommt Fehlermeldung das ein Parameter bereits initialisiert ist.


foreach (ArrayList str_sql in al_sqlstring)
            {
                string sqlStatement = str_sql[0].ToString();

                command.CommandText = sqlStatement;

                if (al_param_insert.Count != 0)
                {
                    
                    ArrayList alTemp = (ArrayList)str_sql[1];
                    
                    
                    foreach (ArrayList al_val in alTemp)
                    {
                        int index_al = al_val.Count;
                        for (int i = 0; i < index_al; i++)
                        {

                            //Hinzufügen Parameterliste ("@string-parametername",object value)
                            command.Parameters.AddWithValue(al_param_insert[i].ToString(), al_val[i]);
                        }
                    }
                }
            }

            command.Transaction = transaction;
            
            try
            {
                // Änderungen auf der Datenbank durchführen
                command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                // Anwendungsausnahme werfen
                throw new ApplicationException("Fehler beim aktualisieren von Datenbanktabelle", ex);
            }
                
        }


Grüsse
Sharp.New

1.985 Beiträge seit 2004
vor 17 Jahren

Hallo sharp.new,

heißen die Parameter immer gleich? Wenn ja, ist das der Grund für die Meldung. Du kannst natürlich mit AddWithValue keinen Parameter hinzufügen, der schon vorhanden ist.

Du musst die Parameter-Collection vorher löschen.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

F
10.010 Beiträge seit 2004
vor 17 Jahren

So geht das nicht.

Was Du machen willst geht anders.
Entweder du machst so viele SQLStrings wie Strings in der Arraylist, oder Du
machst das ExecuteNonQuery in der schleife, was der gebräuchliche weg ist.

Du kannst hierzu erst das CommandObject erzeugen, die ParameterCollection
erstellen und dann in der schleife die Werte befüllen und das Command ausführen.


if(al_param_insert.Count <= 0 )
  return; // nichts zu tun, also raus hier

string sqlStatement = str_sql[0].ToString();
command.CommandText = sqlStatement;
for (int i = 0; i < al_param_insert.Count; i++)
{
  command.Parameters.Add(al_param_insert[i].ToString());
}
command.Transaction = transaction;



foreach (ArrayList str_sql in al_sqlstring)
{
  ArrayList alTemp = (ArrayList)str_sql[1];


  foreach (ArrayList al_val in alTemp)
  {
    int index_al = al_val.Count;
    for (int i = 0; i < al_param_insert.Count; i++)
    {
      if( i < index_al )
        command.Parameters[al_param_insert[i].ToString()].Value = al_val[i]);
      else
        command.Parameters[al_param_insert[i].ToString()].Value = null;
    }
  }

  try
  {
  // Änderungen auf der Datenbank durchführen
    command.ExecuteNonQuery();
                
  }
  catch (SqlException ex)
  {
  // Anwendungsausnahme werfen
    throw new ApplicationException("Fehler beim aktualisieren von Datenbanktabelle", ex);
  }

} 

Und dran denken die Transaction auch ordentlich zu beenden, also Comit und Rollback einzubauen.

S
sharp.new Themenstarter:in
100 Beiträge seit 2006
vor 17 Jahren

Hallo FZelle,
danke für den Codeblock, aber leider funktioniert es nicht.
Scon bei der Command-Object Erzeugung erhalte ich eine Fehlermeldung:

Sql-ParameterColection akzeptiert nur Typobjecte keine Stringobjecte

Entweder habe ich das Konzept der Parametercollection nicht verstanden, es ist doch so dass einem Parameter @DB-Feld eine Value zugewiesen wird. Der Parameter ist in meinem Fall ein String den ich äquivalent der DB-Spaltenname erzeuge.

Grüsse

F
10.010 Beiträge seit 2004
vor 17 Jahren

Die ParameterCollection ist für genau einen SQL-Befehl gedacht und das Add
der Collection ertwartet als ersten Parameter einen String ( den Namen des
Parameters ) und dann gibt es einige Überladungen des Add() der Collection.

In meinem CodeSchnipsel setze ich erst den CommandText des SqlCommands.
Dann Adde ich die einzelnen ParameterNamen in die Collection.
Hier müsste ggf der Typ mit angegeben werden.

In der Schleife dann werden nur die Values in die ParameterCollection eingetragen.
Da Value ein Object ist, kann man hier alles reingeben, auch String.
Wenn Du weiter oben keinen Typ angibst, wird auch string erwartet.

Und wo erstellst Du das Command Object?
In deinem Code oben jedenfalls nicht.