Abfrage SQL-Server mit Parametern / Syntax

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von SchorschCode.

    Abfrage SQL-Server mit Parametern / Syntax

    Hallo zusammen,

    ich habe eine Frage zur Syntax wenn ich Parameter an eine SQL-Abfrage übergebe. Zum Erstellen des SqlCommands benutze ich folgende Funktion (danke an den Erfinder des Rades):

    VB.NET-Quellcode

    1. Public Function CRECOMM(ByVal commandText As String, ByVal ParamArray values As Object()) As SqlCommand
    2. If commandText.Split("?"c).Count <> values.Length + 1 Then
    3. Throw New ArgumentException("Anzahl der Argumente passt nicht zur Anzahl der Parameter-Platzhalter im CommandText")
    4. Exit Function
    5. End If
    6. CRECOMM = New SqlCommand() With {.CommandText = commandText, .Connection = sqlFIL}
    7. For i = 0 To values.Length - 1
    8. CRECOMM.Parameters.AddWithValue("@a" & i, values(i))
    9. Next
    10. End Function


    Die SQL-Abfrage erstelle ich so:

    VB.NET-Quellcode

    1. Dim cm As New SqlCommand
    2. Dim da As New SqlDataAdapter
    3. Dim dt As New DataTable
    4. Dim dr As DataRow
    5. Dim strSQL As String = "SELECT KDKONTO, KDADRESSE FROM tblTesttabelle WHERE tblTesttabelle.KDKONTO = '4711'"
    6. cm = CRECOMM(strSQL)
    7. With da
    8. .SelectCommand = cm
    9. .Fill(dt)
    10. End With
    11. Dim strPcBUG as String = dt.Rows.Count.ToString


    Das funktioniert. Aber ich will ja eben nicht den Parameter "4711" im SQL-String stehen haben. Für Access und eine OLE-DB-Connection funktioniert das dann so:

    VB.NET-Quellcode

    1. Dim strSQL As String = "SELECT KDKONTO, KDADRESSE FROM tblTesttabelle WHERE tblTesttabelle.KDKONTO = ?"
    2. cm = CRECOMM(strSQL, txtKONTO.Text)


    In txtKONTO.Text gebe ich also z.B. "4711" ein.

    Das funktioniert aber nicht für SQL-Express (Fehlermeldung: "Falsche Syntax in der Nähe von ?"). Ich habe bereits folgendes ausprobiert:

    VB.NET-Quellcode

    1. Dim strSQL As String = "SELECT KDKONTO, KDADRESSE FROM tblTesttabelle WHERE tblTesttabelle.KDKONTO = '?'"
    2. Dim strSQL As String = "SELECT KDKONTO, KDADRESSE FROM tblTesttabelle WHERE tblTesttabelle.KDKONTO = N'?'"


    Jetzt stehe ich auf dem Schlauch.

    Jeder Tipp ist willkommen. Danke im voraus!

    Gruß Schorsch

    SchorschCode schrieb:

    Die SQL-Abfrage erstelle ich so:

    VB.NET-Quellcode

    1. Dim strSQL As String = "SELECT KDKONTO, KDADRESSE FROM tblTesttabelle WHERE tblTesttabelle.KDKONTO = '?'"
    2. cm = CRECOMM(strSQL,4711)
    vermutlich sollteste dich mit dem Schlüsselwort ParamArray auseinandersetzen - damit kann man variabel viele Argumente übergeben.
    @HenryV: Danke für den Tipp! Das war's. Kaum macht man's richtig, schon klappt es auch...

    @ErfinderDesRades: Erst einmal danke für diese glorreiche Funktion (und viele andere). Wenn ich Deine Lösungen lese denke ich immer, dass ich eigentlich gar nicht programmieren kann... Das ParamArray nutze ich schon. So funktioniert es bei mir:

    VB.NET-Quellcode

    1. Public Function CreComm(ByVal con As SqlConnection, ByVal commandText As String, ByVal ParamArray values As Object()) As SqlCommand
    2. Dim cmd = New SqlCommand()
    3. Dim paramNames(values.Length - 1) As String
    4. For i = 0 To values.Length - 1
    5. paramNames(i) = "@a" & i
    6. Dim param = cmd.Parameters.AddWithValue(paramNames(i), values(i))
    7. Next
    8. cmd.CommandText = String.Format(commandText, paramNames)
    9. cmd.Connection = con
    10. Return cmd
    11. End Function


    Danke beiden für die Hilfe!

    Gruß, Schorsch