Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - SQL-Tabelle per for-Schleife füllen


Doug123 - Di 01.07.08 08:56
Titel: SQL-Tabelle per for-Schleife füllen
Schönen guten Morgen!

Ich benutze den SQL Server 2005 und möchte nun in eine von meinen erstellten Tabellen in der Datenbank per for-Schleife Pseudodaten einfügen, um zu schauen wie lange das so ungefähr dauert.

Meine bisherige Vorgehensweise (die leider nicht funktioniert) war diese:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
try
{
    _OpenConnection(sServer, sDataBase);

    command = connection.CreateCommand();
    command.CommandText = "INSERT INTO " + sTableName + " (ID, Spalte1, Spalte2) " + "VALUES(@ID, @Spalte1, @Spalte2)";

for (int i = 1; i<=100; i++)
{
     command.Parameters.AddWithValue("@ID""ID").Value = i;
     command.Parameters.AddWithValue("@Spalte1""Spalte1").Value = i.ToString();
     command.Parameters.AddWithValue("@Spalte2""Spalte2").Value = i.ToString();

     command.ExecuteNonQuery();
}
catch (SqlException ex)
{
  MessageBox.Show(ex.Message);
}
finally
{
  CloseConnection();
}


Ich bekomme nach dem Einfügen des ersten Datensatzes dann folgende Meldung ausgegeben:

"Der Variablenname '@ID' wurde bereits deklariert. Variablenamen müssen in einem Abfragebereich oder in einer gespeicherten Prozedur eindeutig sein."


Wie kann man das nun am besten realisieren, da ich momentan net weiß, wie ich außer mit dem "AddWithValue" den einzelnen Zellen Werte zuweisen kann!

Ich hoffe, dass ihr mir ein wenig weiterhelfen könnt! Vielen Dank!

Gruß
Doug


JüTho - Di 01.07.08 09:24

Hallo,

zunächst meine Standardantwort: Schau in der SDK-Doku (= MSDN Library) nach, welche Methoden es bei Parameters noch gibt. Dann stellst Du fest, dass Du (wie meistens mindestens) zwei Möglichkeiten hast:

1. In jedem Durchgang der Schleife werden zunächst alle Parameter gelöscht und dann (wie bisher) neu erzeugt.
2. Viel besser: Die Parameter werden einmal erzeugt, in jedem Durchgang werden nur neue Werte eingetragen. Also etwa so:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
    command = connection.CreateCommand();
    command.CommandText = "INSERT INTO " + sTableName + " (ID, Spalte1, Spalte2) " 
        + "VALUES(@ID, @Spalte1, @Spalte2)";
     command.Parameters.Add("@ID", SqlDbType.Int32);
     command.Parameters.Add("@Spalte1", SqlDbType.String);
     command.Parameters.Add("@Spalte2", SqlDbType.String);

for (int i = 1; i<=100; i++)  {
     command.Parameters["@ID"].Value = i;
     command.Parameters["@Spalte1"].Value = i.ToString();
     command.Parameters["@Spalte2"].Value = i.ToString();

     command.ExecuteNonQuery();
}

Wundere Dich aber nicht, dass dies "sehr lange" dauern wird: Bei einer Schleife mit vielen Datensätzen wird meistens mit DbTransaction gearbeitet, um mehrere Datensätze "am Stück" zu verarbeiten.

Gruß Jürgen


Doug123 - Di 01.07.08 12:59

Vielen Dank für deine Antwort! Klappt jetzt alles wunderbar! :)


Gruß
Doug