SQL erkennt Variable als Spaltenname [Insert Into]

  • VB.NET

Es gibt 34 Antworten in diesem Thema. Der letzte Beitrag () ist von mmgg.

    SQL erkennt Variable als Spaltenname [Insert Into]

    Hallo Leute,

    ich habe ein Problem: Ich möchte in eine SQL Datenbank Werte eintragen und habe dazu den code ...

    VB.NET-Quellcode

    1. Dim DBNachname As String = Me.tbNachname.Text
    2. Dim DBVorname As String = Me.tbVorname.Text
    3. Dim SQLCon As New SqlConnection With {.ConnectionString = "Server=NICK-PC\SQLEXPRESS;Database=Fahrschüler;Trusted_Connection=Yes;"} ' Erwstelt Connectiostring für SQL Server
    4. SQLCon.Open()
    5. Dim Ds As DataSet = New DataSet()
    6. Dim da As New SqlClient.SqlDataAdapter("INSERT INTO Fahrschüler (Nachname, Vorname, Anmeldedatum, Erinnerungsdatum) VALUES (DBNachname,DBVorname,'2014-08-17','2014-08-30')", SQLCon)
    7. da.Fill(Ds, "Fahrschüler")
    8. MsgBox("Abgeschlossen")
    9. SQLCon.Close()


    ...verwendet. Mein Plan ist es, dass man Vorname und Nachname in die Textboxen eingibt, und er den Wert dann in die Tabelle schreibt. Doch wenn ich das Programm starten will bekomme ich den Error:

    "Eine nicht behandelte Ausnahme des Typs "System.Data.SqlClient.SqlException" ist in System.Data.dll aufgetreten.

    Zusätzliche Informationen: Ungültiger Spaltenname 'DBNachname'.

    Ungültiger Spaltenname 'DBVorname'."

    Woran liegt das ? Ist meine Syntax in der SQl Anweisung bei den Variablen falsch?
    Ich habe das Internet schon 2 Stunden durchsucht, weiß aber auch nicht, nach was ich suchen soll.

    Ich wäre euch füt Hilfe echt dankbar

    Schnickalodeon (VB Anfänger)
    Habe meinen Code jetzt mal umgeschrieben so dass er so:

    VB.NET-Quellcode

    1. Dim DBNachname As String = Me.tbNachname.Text
    2. Dim DBVorname As String = Me.tbVorname.Text
    3. Dim SQLCon As New SqlConnection With {.ConnectionString = "Server=NICK-PC\SQLEXPRESS;Database=Fahrschüler;Trusted_Connection=Yes;"} ' Erwstelt Connectiostring für SQL Server
    4. Dim querryString As String = "INSERT INTO Fahrschüler (Nachname, Vorname, Anmeldedatum, Erinnerungsdatum) VALUES (?,?,'2014-08-17','2014-08-30')"
    5. Dim Command As New SqlCommand(querryString, SQLCon)
    6. SQLCon.Open() ' Öffnet Connection zu SQL Server und der Datenbank
    7. Dim Ds As DataSet = New DataSet()
    8. Dim da As New SqlClient.SqlDataAdapter(querryString, SQLCon)
    9. Command.Parameters.AddWithValue("?", DBNachname)
    10. Command.Parameters.AddWithValue("?", DBVorname)
    11. da.Fill(Ds, "Fahrschüler")
    12. MsgBox("Abgeschlossen")
    13. SQLCon.Close() ' Schließt die Verbindung


    aussieht aber ich bekomme diesmal die Fehlermeldung falsche Syntax in der Nähe von "?"
    Ich weiß aber leider nicht mal, ob der Ansatz richtig ist.
    Wieso nicht die verlinkte Methode benutzen? :)

    VB.NET-Quellcode

    1. ​Imports System.Data.SqlClient
    2. Public Module SqlCeExtensions
    3. ''' <summary> allgemeine Methode, aus einer SqlCeConnection, einem CommandText und optionalen Werten
    4. ''' ein parametrisiertes SqlCeCommand zu erstellen </summary>
    5. ''' <remarks>Vorrausgeetzt ist, dass die übergebenen values Datentypen haben, die zu den in der Datenbank
    6. ''' festgelegten Spalten passen. Eine Überprüfung findet nicht statt.</remarks>
    7. <Runtime.CompilerServices.Extension()> _
    8. Public Function CreateCommand(ByVal con As SqlConnection, ByVal commandText As String, ByVal ParamArray values As Object()) As SqlCommand
    9. Dim splits = commandText.Split("?"c) ' Parameter-Platzhalter '?' identifizieren
    10. If splits.Count <> values.Length + 1 Then Throw New ArgumentException( _
    11. "Anzahl der Argumente passt nicht zur Anzahl der Parameter-Platzhalter im CommandText")
    12. Dim cmd = New SqlCommand()
    13. ' für jeden Platzhalter einen DbParameter adden, und den Param-Namen an den Platzhalter schreiben
    14. For i = 0 To values.Length - 1
    15. Dim param = cmd.Parameters.AddWithValue("@a" & i, values(i))
    16. splits(i) = splits(i) & param.ParameterName
    17. Next
    18. cmd.CommandText = String.Concat(splits)
    19. cmd.Connection = con
    20. Return cmd
    21. End Function
    22. End Module


    VB.NET-Quellcode

    1. ​Dim dbNachname As String = "Vorname"
    2. Dim dbVorname As String = "Nachname"
    3. Dim sqlCon As New SqlConnection With {.ConnectionString = "Server=NICK-PC\SQLEXPRESS;Database=Fahrschüler;Trusted_Connection=Yes;"} ' Erwstelt Connectiostring für SQL Server
    4. Dim querryString As String = "INSERT INTO Fahrschüler (Nachname, Vorname, Anmeldedatum, Erinnerungsdatum) VALUES (?, ?,'2014-08-17','2014-08-30')"
    5. Dim command As SqlCommand = sqlCon.CreateCommand(querryString, dbNachname, dbVorname)
    6. '...

    VB.NET-Quellcode

    1. ​Dim querryString As String = "INSERT INTO Fahrschüler (Nachname, Vorname, Anmeldedatum, Erinnerungsdatum) VALUES (@nachname,@vorname,'2014-08-17','2014-08-30')"
    2. Command.Parameters.AddWithValue("@nachname", Varchar, DBNachname)
    3. Command.Parameters.AddWithValue("@vorname", Varchar, DBVorname)


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Weil das einen Laufzeitfehler ergibt...
    Varchars (Strings) müssen unter Hochkomma (') gestellt werden was bei dir hier nicht der Fall gewesen wäre. Datum muss auch richtig formatiert sein, und und und. DB-Parameter übernehmen das ganze Konvertiere und Formatiere und solche Fehler können erst gar nicht passieren.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Habe ich nun Versucht jedoch immernoch der gleiche Fehler

    Visual Basic-Quellcode

    1. Imports System.Data.Sql
    2. Imports System.Data.SqlClient
    3. Public Module SqlCeExtensions
    4. ''' <summary> allgemeine Methode, aus einer SqlCeConnection, einem CommandText und optionalen Werten
    5. ''' ein parametrisiertes SqlCeCommand zu erstellen </summary>
    6. ''' <remarks>Vorrausgeetzt ist, dass die übergebenen values Datentypen haben, die zu den in der Datenbank
    7. ''' festgelegten Spalten passen. Eine Überprüfung findet nicht statt.</remarks>
    8. <Runtime.CompilerServices.Extension()> _
    9. Public Function CreateCommand(ByVal con As SqlConnection, ByVal commandText As String, ByVal ParamArray values As Object()) As SqlCommand
    10. Dim splits = commandText.Split("?"c) ' Parameter-Platzhalter '?' identifizieren
    11. If splits.Count <> values.Length + 1 Then Throw New ArgumentException( _
    12. "Anzahl der Argumente passt nicht zur Anzahl der Parameter-Platzhalter im CommandText")
    13. Dim cmd = New SqlCommand()
    14. ' für jeden Platzhalter einen DbParameter adden, und den Param-Namen an den Platzhalter schreiben
    15. For i = 0 To values.Length - 1
    16. Dim param = cmd.Parameters.AddWithValue("@a" & i, values(i))
    17. splits(i) = splits(i) & param.ParameterName
    18. Next
    19. cmd.CommandText = String.Concat(splits)
    20. cmd.Connection = con
    21. Return cmd
    22. End Function
    23. End Module
    24. Public Class Hauptfenster
    25. Private Sub bAnlegen_Click(sender As Object, e As EventArgs) Handles bAnlegen.Click
    26. Dim dbNachname As String = "Vorname"
    27. Dim dbVorname As String = "Nachname"
    28. Dim sqlCon As New SqlConnection With {.ConnectionString = "Server=NICK-PC\SQLEXPRESS;Database=Fahrschüler;Trusted_Connection=Yes;"} ' Erwstelt Connectiostring für SQL Server
    29. Dim querryString As String = "INSERT INTO Fahrschüler (Nachname, Vorname, Anmeldedatum, Erinnerungsdatum) VALUES (?, ?,'2014-08-17','2014-08-30')"
    30. Dim command As SqlCommand = sqlCon.CreateCommand(querryString, dbNachname, dbVorname)
    31. SQLCon.Open() ' Öffnet Connection zu SQL Server und der Datenbank
    32. Dim Ds As DataSet = New DataSet()
    33. Dim da As New SqlClient.SqlDataAdapter(querryString, SQLCon)
    34. command.Parameters.AddWithValue("?", dbNachname)
    35. command.Parameters.AddWithValue("?", dbVorname)
    36. da.Fill(Ds, "Fahrschüler")
    37. MsgBox("Abgeschlossen")
    38. SQLCon.Close() ' Schließt die Verbindung
    39. End Sub
    40. End Class


    Was mach ich denn Falsch :D

    VB.NET-Quellcode

    1. ​Dim querryString As String = "INSERT INTO Fahrschüler (Nachname, Vorname, Anmeldedatum, Erinnerungsdatum) VALUES (@nachname,@vorname,@anmeldedatum,@erinnerungsdatum)"
    2. Command.Parameters.Add("@nachname", SqlDbType.Varchar).Value = DBNachname
    3. Command.Parameters.Add("@vorname", SqlDbType.Varchar).Value = DBVorname
    4. Command.Parameters.Add("@anmeldedatum", SqlDbType.Datetime).Value = New DateTime(2014,8,17)
    5. Command.Parameters.Add("@erinnerungsdatum", SqlDbType.Datetime).Value = New DateTime(2014,8,30)


    Habs nicht getestet aber müsste so funktionieren.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Ersteinmal nochmal Vielen Dank für die ganze Hilfe und die Viele Geduld. Wie gesagt ich bin noch Anfänger :) Sorry

    Jetzt Tauscht bei mir die Fehhlermerldung auf, die oben im Code steht ( Anzahl der Argumente passt nicht zur Anzahl der Parameter-Platzhalter im CommandText)

    VB.NET-Quellcode

    1. Imports System.Data.Sql
    2. Imports System.Data.SqlClient
    3. Public Module SqlCeExtensions
    4. ''' <summary> allgemeine Methode, aus einer SqlCeConnection, einem CommandText und optionalen Werten
    5. ''' ein parametrisiertes SqlCeCommand zu erstellen </summary>
    6. ''' <remarks>Vorrausgeetzt ist, dass die übergebenen values Datentypen haben, die zu den in der Datenbank
    7. ''' festgelegten Spalten passen. Eine Überprüfung findet nicht statt.</remarks>
    8. <Runtime.CompilerServices.Extension()> _
    9. Public Function CreateCommand(ByVal con As SqlConnection, ByVal commandText As String, ByVal ParamArray values As Object()) As SqlCommand
    10. Dim splits = commandText.Split("?"c) ' Parameter-Platzhalter '?' identifizieren
    11. If splits.Count <> values.Length + 1 Then Throw New ArgumentException( _
    12. "Anzahl der Argumente passt nicht zur Anzahl der Parameter-Platzhalter im CommandText")
    13. Dim cmd = New SqlCommand()
    14. ' für jeden Platzhalter einen DbParameter adden, und den Param-Namen an den Platzhalter schreiben
    15. For i = 0 To values.Length - 1
    16. Dim param = cmd.Parameters.AddWithValue("@a" & i, values(i))
    17. splits(i) = splits(i) & param.ParameterName
    18. Next
    19. cmd.CommandText = String.Concat(splits)
    20. cmd.Connection = con
    21. Return cmd
    22. End Function
    23. End Module
    24. Public Class Hauptfenster
    25. Private Sub bAnlegen_Click(sender As Object, e As EventArgs) Handles bAnlegen.Click
    26. Dim dbNachname As String = Me.tbNachname.Text
    27. Dim dbVorname As String = Me.tbVorname.Text
    28. Dim sqlCon As New SqlConnection With {.ConnectionString = "Server=NICK-PC\SQLEXPRESS;Database=Fahrschüler;Trusted_Connection=Yes;"} ' Erwstelt Connectiostring für SQL Server
    29. Dim querryString As String = "INSERT INTO Fahrschüler (Nachname, Vorname, Anmeldedatum, Erinnerungsdatum) VALUES (@nachname,@vorname,@anmeldedatum,@erinnerungsdatum)"
    30. Dim command As SqlCommand = sqlCon.CreateCommand(querryString, dbNachname, dbVorname)
    31. command.Parameters.Add("@nachname", SqlDbType.VarChar).Value = dbNachname
    32. command.Parameters.Add("@vorname", SqlDbType.VarChar).Value = dbVorname
    33. command.Parameters.Add("@anmeldedatum", SqlDbType.DateTime).Value = New DateTime(2014, 8, 17)
    34. command.Parameters.Add("@erinnerungsdatum", SqlDbType.DateTime).Value = New DateTime(2014, 8, 30)
    35. SQLCon.Open() ' Öffnet Connection zu SQL Server und der Datenbank
    36. Dim Ds As DataSet = New DataSet()
    37. Dim da As New SqlClient.SqlDataAdapter(querryString, SQLCon)
    38. da.Fill(Ds, "Fahrschüler")
    39. MessageBox.Show("Abgeschlossen")
    40. SQLCon.Close() ' Schließt die Verbindung
    41. End Sub
    42. End Class
    Du darfst die Antworten von uns nicht vermischen ;)

    VB.NET-Quellcode

    1. Dim dbNachname As String = "Nachname"
    2. Dim dbVorname As String = "Vorname"
    3. Dim sqlCon As New SqlConnection With {.ConnectionString = "Server=NICK-PC\SQLEXPRESS;Database=Fahrschüler;Trusted_Connection=Yes;"} ' Erwstelt Connectiostring für SQL Server
    4. Dim querryString As String = "INSERT INTO Fahrschüler (Nachname, Vorname, Anmeldedatum, Erinnerungsdatum) VALUES (?,?,?,?)"
    5. Dim command As SqlCommand = sqlCon.CreateCommand(querryString, dbNachname, dbVorname, New DateTime(2014, 8, 17), New DateTime(2014, 8, 30))
    6. sqlCon.Open() ' Öffnet Connection zu SQL Server und der Datenbank
    7. Dim ds As DataSet = New DataSet()
    8. Dim da As New SqlClient.SqlDataAdapter(querryString, sqlCon)
    9. da.Fill(ds, "Fahrschüler")
    10. MessageBox.Show("Abgeschlossen")
    11. sqlCon.Close() ' Schließt die Verbindung


    Die Methode ​CreateCommand lässt doch deine Parameter schon mir einfließen. Danach ist der Command fertig.
    Also entweder die Methode CreateCommand nutzen, oder die Parameter manuell mit ​command.Parameters.Add hinzufügen.
    Ist das nur so bei mir, oder hat die SqlConnetion.CreateCommand() Methode keine Überladungen?

    Kann daher die Parameter nicht übergeben?
    Sonst führe ich Abfragen auch anders aus, wollte aber mal ne andere Methode probieren.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    @Rootbob91 Das ist auch eine Extension-Methode.
    In Post #4 wurde die verlinkt :)

    VB.NET-Quellcode

    1. ​Public Module SqlCeExtensions
    2. ''' <summary> allgemeine Methode, aus einer SqlCeConnection, einem CommandText und optionalen Werten
    3. ''' ein parametrisiertes SqlCeCommand zu erstellen </summary>
    4. ''' <remarks>Vorrausgeetzt ist, dass die übergebenen values Datentypen haben, die zu den in der Datenbank
    5. ''' festgelegten Spalten passen. Eine Überprüfung findet nicht statt.</remarks>
    6. <Runtime.CompilerServices.Extension()> _
    7. Public Function CreateCommand(ByVal con As SqlConnection, ByVal commandText As String, ByVal ParamArray values As Object()) As SqlCommand
    8. Dim splits = commandText.Split("?"c) ' Parameter-Platzhalter '?' identifizieren
    9. If splits.Count <> values.Length + 1 Then Throw New ArgumentException( _
    10. "Anzahl der Argumente passt nicht zur Anzahl der Parameter-Platzhalter im CommandText")
    11. Dim cmd = New SqlCommand()
    12. ' für jeden Platzhalter einen DbParameter adden, und den Param-Namen an den Platzhalter schreiben
    13. For i = 0 To values.Length - 1
    14. Dim param = cmd.Parameters.AddWithValue("@a" & i, values(i))
    15. splits(i) = splits(i) & param.ParameterName
    16. Next
    17. cmd.CommandText = String.Concat(splits)
    18. cmd.Connection = con
    19. Return cmd
    20. End Function
    21. End Module
    Ach shi*t :/.. nicht gesehen.

    Hat dann geklappt, wichtig ist, dass man im Modul die Namespaces Importieren muss, sonst wird die Methode nicht korrekt überladen, hatte die Namespaces per Hand angegeben, dass ging nicht.

    Aber jetzt geht's, danke für die neue Methode ;)!

    PS: Kann ich die Fragezeichen auch so in nem Update, oder Delete Befehl benutzen?

    Zb.

    Visual Basic-Quellcode

    1. "UPDATE tabelle SET cName=? kKategorie=?"

    Und dann aus dem Create Command:

    Visual Basic-Quellcode

    1. ..CreateCommand(SqlConnection, {"Hallo", 13})


    Und zum Abschluss noch die Frage:
    Das ist doch dann sicherer gegen SQL Injections oder?

    EDIT: Funktionieren tut's, nur noch die Antwort auf die Frage also übrig :P..
    Danke schonmal! Auch an den TE, der Thread hat mir auch geholfen ;)!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Rootbob91“ ()

    Alles Klar! MIr war nicht klar das command.Parameters.Add die gleiche Auswirkung hat wie CreateCommand :whistling:
    (Wie gesagt bin noch blutiger Anfänger. Habe im Praktikum mit VB angefangen ohne jemals was mit .NET gemacht zu haben und mir alles zurecht gegooglet)

    Das heißt also ich muss theoretisch nur die Zeilen 38-41 löschen und bei

    Dim querryString As String = "INSERT INTO Fahrschüler (Nachname, Vorname, Anmeldedatum, Erinnerungsdatum) VALUES (@nachname,@vorname,@anmeldedatum,@erinnerungsdatum)"

    die @... durch "?" ersetzen?

    Vielen Dank an alle :)

    p.s Bin echt begeistert von diesem Forum. In einem anderen wurde ich sofort beschimpft, wenn ich etwas nicht sofort verstanden habt. Aber hier: TOP!!!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Schnickalodeon“ ()