Benutzer mit den meisten Antworten
Ungültiger Spaltenname bei ExecuteScalar()

Frage
-
Salü alle zusammen
Bin am umbau eines SQL Command das früher einwandfrei funktioniert hat und erhalte jetzt die Fehlermeldung "Ungültiger Spaltenname: 'ep_lochen' 'r_land_id'
Eigentlich eine deutsch und deutliche Aussage. ABER:
Im SQL Server gibt es die Spalte aber, genau so geschrieben, das hat mit dem alten Code funktioniert. Jetzt habe ich anstelle des zusammengebastelten SQL String neu mit Parametern gearbeitet und er findet die Spalten nicht mehr. Aber eigenartigerweise nur zwei davon nicht.
Wonach könnte ich suchen?
Gibt es eine Beschränkung in der Anzahl der Parameter? Ich habe rund 70 davon.
Spielt es eine Rolle ob ich nach dem Komma ein Leerzeichen mache (ep_perforieren, ep_lochen)?Alter zusammengesetzte Code
Dim mycmd As New SqlCommand
mycmd.Connection = myconn
mycmd.CommandText = "INSERT INTO tbl_auftraege (... ep_perforieren, ep_lochen, ep_express,... , r_ort, r_land_id) VALUES ("... & ", " & Session("ep_lochen") & ", " ... & Replace(Session("r_ort"), "'", "''") & "', " & Session("r_land_id") & ")"
mycmd.ExecuteScalar()
mycmd.CommandText = "SELECT @@IDENTITY"
Session("auftrags_id") = mycmd.ExecuteScalar()
myconn.Close()Neuer Code mit Parametern
mycmd.Parameters.AddWithValue("@ep_falzen", Session("ep_falzen"))
mycmd.Parameters.AddWithValue("@r_ort", Replace(Session("r_ort"), "'", "''"))
mycmd.Parameters.AddWithValue("@r_land_id", Replace(Session("r_land_id"), "'", "''"))
dim vSQL as string = "INSERT INTO tbl_auftraege "
...
vSQL += "ep_perforieren,ep_lochen,ep_express,"
...
vSQL += ") VALUES ("
...
vSQL += "@ep_perforieren,ep_lochen,@ep_express,"
...
vSQL += "@r_ort,r_land_id)"
mycmd.CommandText = vSQL
mycmd.ExecuteScalar()
mycmd.CommandText = "SELECT @@IDENTITY"
Session("auftrags_id") = mycmd.ExecuteScalar()
myconn.Close()Vielen Dank für Hinweise welche zum finden der Spaltennamen führen
Gruss Sabrina
Antworten
-
Hallo Sabrina,
durch das Wegkürzen fehlt ein klein Wenig der Zusammenhang.
Da die ZeilevSQL += "@ep_perforieren,ep_lochen,@ep_express,"
nach VALUES kommt, dürfte das ep_lochen dort der Verursacher sein.
Daraus sollte ein @ep_lochen werden und der damit eingeführten Variable ein Wert zugewiesen werden.vSQL += "@ep_perforieren, @ep_lochen, @ep_express,"
mycmd.Parameters.AddWithValue("@ep_lochen", Session("ep_lochen"))
Im übrigen solltest Du die Parameter Zuweisungen noch einmal überprüfen.
Die Replace(Session(...), , "'", "''") sind bei Parametern nicht mehr notwendig -
vielmehr würden verdoppelte Anführungszeichen in den Daten gespeichert.Sinnvoll wäre eine Überprüfung der maximalen Länge für Zeichendaten,
sonst schlägt die Anweisung u. U. deswegen fehl.Die beiden Aufrufe von ExecuteScalar() kannst Du auf einen reduzieren,
in dem Du die Abfrage an das INSERT anhängst -
wobei ich SCOPE_IDENTITY() den Vorzug geben würde:vSQL += ";SELECT SCOPE_IDENTITY() AS auftrags_id;" mycmd.CommandText = vSQL Session("auftrags_id") = mycmd.ExecuteScalar()
Alternativ könnte man auch die OUTPUT Klausel verwenden.
Damit wird ein Roundtrip zum SQL Server gespart, denn der kann Anweisungen im Stapel verarbeiten.
Parameter kannst Du in einer Anweisung bis zu 2100 haben,
siehe Spezifikationen der maximalen Kapazität für SQL Server
Gruß Elmar- Als Antwort vorgeschlagen Falk Krahl Freitag, 22. Juli 2011 07:49
- Als Antwort markiert Sabrina Sanders Freitag, 22. Juli 2011 08:37
Alle Antworten
-
Hallo Sabrina,
durch das Wegkürzen fehlt ein klein Wenig der Zusammenhang.
Da die ZeilevSQL += "@ep_perforieren,ep_lochen,@ep_express,"
nach VALUES kommt, dürfte das ep_lochen dort der Verursacher sein.
Daraus sollte ein @ep_lochen werden und der damit eingeführten Variable ein Wert zugewiesen werden.vSQL += "@ep_perforieren, @ep_lochen, @ep_express,"
mycmd.Parameters.AddWithValue("@ep_lochen", Session("ep_lochen"))
Im übrigen solltest Du die Parameter Zuweisungen noch einmal überprüfen.
Die Replace(Session(...), , "'", "''") sind bei Parametern nicht mehr notwendig -
vielmehr würden verdoppelte Anführungszeichen in den Daten gespeichert.Sinnvoll wäre eine Überprüfung der maximalen Länge für Zeichendaten,
sonst schlägt die Anweisung u. U. deswegen fehl.Die beiden Aufrufe von ExecuteScalar() kannst Du auf einen reduzieren,
in dem Du die Abfrage an das INSERT anhängst -
wobei ich SCOPE_IDENTITY() den Vorzug geben würde:vSQL += ";SELECT SCOPE_IDENTITY() AS auftrags_id;" mycmd.CommandText = vSQL Session("auftrags_id") = mycmd.ExecuteScalar()
Alternativ könnte man auch die OUTPUT Klausel verwenden.
Damit wird ein Roundtrip zum SQL Server gespart, denn der kann Anweisungen im Stapel verarbeiten.
Parameter kannst Du in einer Anweisung bis zu 2100 haben,
siehe Spezifikationen der maximalen Kapazität für SQL Server
Gruß Elmar- Als Antwort vorgeschlagen Falk Krahl Freitag, 22. Juli 2011 07:49
- Als Antwort markiert Sabrina Sanders Freitag, 22. Juli 2011 08:37
-
Hallo Sabrina,
nur noch einen kleinen Hinweis.
SQL Statements, die keinerlei Rückgabe bewirken, wie UPDATE ..., DELETE FROM ... kannst Du per
<SqlCommand>.ExecuteNonQuery()
ausführen lassen. Bei INSERT empfiehlt sich aus verschiedenen Gründen, wie von Elmar auch vorgeschlagen, SELECT SCOPE_IDENTITY() direkt mit ausführen zu lassen, da ist dann ExecuteScalar() die richtige Methode.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community