Autor Beitrag
Doug123
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Di 01.07.08 08:56 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Di 01.07.08 12:59 
Vielen Dank für deine Antwort! Klappt jetzt alles wunderbar! :)


Gruß
Doug