Problem mit Abfragebatch

23/03/2008 - 01:37 von Gerold Mittelstädt | Report spam
Hallo,

Ich habe eine Schleife, in der ich SELECT-Statements durchführe.

Dim val As Integer = 0
For Each Name As String In ...

val += 1

sCmd.CommandText = "SELECT Count(ID) As c FROM pr WHERE Value=@val
AND pid=@pid"
sCmd.Parameters.AddWithValue("@pid", pid)
sCmd.Parameters.AddWithValue("@val", val)
Dim sRd As SqlDataReader = sCmd.ExecuteReader
sRd.Read()
...
Next

Problem ist, dass die Schleife nur einmal durchlàuft. Beim 2. mal kommt die
Meldung
SqlException (0x80131904): Der Variablenname '@pid' wurde bereits
deklariert. Variablennamen müssen in einem Abfragebatch oder in einer
gespeicherten Prozedur eindeutig sein.

Wie làsst sich das am besten lösen?

Viele Grüße!
 

Lesen sie die antworten

#1 Elmar Boye
23/03/2008 - 09:17 | Warnen spam
Hallo Gerold,

Gerold Mittelstàdt schrieb:
Ich habe eine Schleife, in der ich SELECT-Statements durchführe.

Dim val As Integer = 0
For Each Name As String In ...

val += 1

sCmd.CommandText = "SELECT Count(ID) As c FROM pr WHERE Value=@val
AND pid=@pid"
sCmd.Parameters.AddWithValue("@pid", pid)
sCmd.Parameters.AddWithValue("@val", val)
Dim sRd As SqlDataReader = sCmd.ExecuteReader
sRd.Read()
...
Next

Problem ist, dass die Schleife nur einmal durchlàuft. Beim 2. mal kommt
die Meldung
SqlException (0x80131904): Der Variablenname '@pid' wurde bereits
deklariert. Variablennamen müssen in einem Abfragebatch oder in einer
gespeicherten Prozedur eindeutig sein.



Sagt er doch: Du willst die Parameter mehrmalig anfügen.
Sinnvoller ist in solchen Fàllen das gesamte Command mit Parametern
ausserhalb der Schleife vorzubereiten und nur die Werte zu übergeben,
das spart die eine oder andere Garbage Collection.


sCmd.CommandText = "SELECT Count(ID) As c ..."

kann COUNT(*) sein, wenn ID NOT NULL ist (wie der Name vermuten làsst).

// Datentyp ggf. anpassen
sCmd.Parameters.Add(new SqlParameter("@pid", GetType(Integer)))
sCmd.Parameters.Add(new SqlParameter("@val", GetType(Integer)))
for Each ...
sCmd.Parameter("@pid").Value = pid
sCmd.Parameter("@val").Value = val

Dim count as Integer
count = CType(sCmd.ExecuteScalar(), Integer)
...

Wie làsst sich das am besten lösen?



Im übrigen ist ExecuteScalar ein bisschen günstiger.
Noch günstiger wàre, Du würdest das ganze zu einem SQL Befehl
verdichten, denn so hast Du viele RoundTrips zum SQL Server.

Gruß Elmar

Ähnliche fragen