none
Ungültiger Spaltenname bei ExecuteScalar() RRS feed

  • 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

    Freitag, 22. Juli 2011 05:29

Antworten

  • Hallo Sabrina,

    durch das Wegkürzen fehlt ein klein Wenig der Zusammenhang.
    Da die Zeile

    vSQL += "@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,"
    
    Auf Basis des alten Codes dürfte das sein:
    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
    Freitag, 22. Juli 2011 07:36
    Beantworter

Alle Antworten

  • Hallo Sabrina,

    durch das Wegkürzen fehlt ein klein Wenig der Zusammenhang.
    Da die Zeile

    vSQL += "@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,"
    
    Auf Basis des alten Codes dürfte das sein:
    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
    Freitag, 22. Juli 2011 07:36
    Beantworter
  • Supervielen Dank für Deine ausführlichen Hinweise. Es war genau was Du gesagt hast. Uf, bin ich froh.

    Die weiteren Vorschläge werde ich gerne einbauen. Vielen Dank dafür.

    Sei gegrüsst
    Sabrina

    Freitag, 22. Juli 2011 08:38
  • 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
    Freitag, 22. Juli 2011 08:49
    Moderator