none
Query auf eine SQL Express Datenbank mit FehlerSklarvariable definieren RRS feed

  • Frage

  • Hallo ich versuche ein Login Bildschirm als Windowsformsanwendung zu erstellen und möchte eine Parametrisierte Abfrage zu meiner Datenbank für den Benutzer, Passwort und einen Wahr oder Falsch wert aus führen und bekommen ein Fehlermeldung @Benutzer Skalarvariable muss definiert werden. Irgendwie finde ich den Fehler nicht den ich habe die Variablen vorher definiert.

    wer kann mir da helfen ich benutze folgenden Code

    Definiert als Klasse: 
    
    Public Sub ParamQuery(Query As String, Optional Collate As Collation = Collation.None)
            Try
                ODBCcon.Open()
    
    
                If Collate = Collation.CaseSensitive Then Query = Query & " COLLATE SQL_Latin1_General_CP1_CS_AS "
    
                ODBCcmd = New OdbcCommand(Query, ODBCcon)
    
                For Each p As OdbcParameter In ODBCParam
                    MsgBox(p.ParameterName & ":" & p.Value)
                    ODBCcmd.Parameters.Add(p)
                    ODBCcmd.Parameters(p.ParameterName).Value = p.Value
                Next
    
                ODBCDA = New OdbcDataAdapter(ODBCcmd)
                ODBCDataSet = New DataSet
                ODBCDA.Fill(ODBCDataSet)
    
                MsgBox(Query & vbCrLf & ODBCDataSet.Tables(0).Rows(0).Item(0), MsgBoxStyle.OkOnly, "Erfolgreich")
    
                ODBCcon.Close()
            Catch ex As Exception
                If ODBCcon.State = ConnectionState.Open Then ODBCcon.Close()
                MsgBox("Abfrage fehlgeschlagen : " & ex.Message)
                MsgBox(Query)
            End Try
    
        End Sub
    
        Public Sub AddParam(Name As String, Value As Object, Optional DataType As DbType = DbType.String)
            Dim newParam As New OdbcParameter With {.ParameterName = Name, .Value = Value, .DbType = DataType}
            ODBCParam.Add(newParam)
        End Sub
    
        'Parameter leeren
        Public Sub FlushParams()
            ODBCParam.Clear()
        End Sub
    
        Public Enum Collation
            None
            CaseSensitive
        End Enum
    
    
    in der Form:
    
    
    
    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
    
                  ODBC.AddParam("@Benutzer", txtBenutzername.Text, SqlDbType.VarChar)
            ODBC.AddParam("@Passwort", txtPasswort.Text, DbType.String)
            ODBC.AddParam("@Lagerist", True, DbType.Boolean)
    
            ODBC.ParamQuery("SELECT Name FROM Mitarbeiter WHERE Name = @Benutzer " &
                            "AND PIN = @Passwort AND Lagerist = @Lagerist ", ODBCControl.Collation.CaseSensitive)
    
    
            frmMenü.Show()
            Me.Hide()
    
        End Sub

    Danke

    Remo

    Dienstag, 1. März 2016 22:23

Antworten

  •         ODBC.ParamQuery("SELECT Name FROM Mitarbeiter WHERE Name = @Benutzer " &
                            "AND PIN = @Passwort AND Lagerist = @Lagerist ", ODBCControl.Collation.CaseSensitive)

    Hallo Remo,

    warum verwendest Du den die ODBC Klassen und nicht System.Data.SqlClient Namespace?

    ODBC unterstützt meines Wissens keine benannten Parameter, sondern sogenannte "positional Parameter", siehe Configuring Parameters and Parameter Data Types => Working with Parameter Placeholders => System.Data.Odbc => Uses positional parameter markers indicated by a question mark (?).

    Deswegen kommt eine Fehlermeldung wegen "Skalarvariable" und nicht wegen fehlendem Parameter. Die Abfrage muss also so lauten:

    ODBC.ParamQuery("SELECT Name FROM Mitarbeiter WHERE Name = ? " &
                    "AND PIN = ? AND Lagerist = ? ", ODBCControl.Collation.CaseSensitive)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert RemoM Donnerstag, 10. März 2016 19:51
    Mittwoch, 2. März 2016 07:23
  • Hallo Olaf ,

    ich hatte mal mit ner ODBC Verbindung angefangen. Da ich noch nicht genau weiß ob das MobileBarcodeerfassungsgerät mit dem SQL Verbindungsstring klarkommt.

    Ich weiß nur das die ODBC Verbindung funktioniert.

    Vielen Dank für Deine Hilfe hab den Code so umgebaut und nun funktuioniert die Abfrage.

    Remo Maurer

    • Als Antwort markiert RemoM Donnerstag, 10. März 2016 19:51
    Mittwoch, 2. März 2016 22:28

Alle Antworten

  •         ODBC.ParamQuery("SELECT Name FROM Mitarbeiter WHERE Name = @Benutzer " &
                            "AND PIN = @Passwort AND Lagerist = @Lagerist ", ODBCControl.Collation.CaseSensitive)

    Hallo Remo,

    warum verwendest Du den die ODBC Klassen und nicht System.Data.SqlClient Namespace?

    ODBC unterstützt meines Wissens keine benannten Parameter, sondern sogenannte "positional Parameter", siehe Configuring Parameters and Parameter Data Types => Working with Parameter Placeholders => System.Data.Odbc => Uses positional parameter markers indicated by a question mark (?).

    Deswegen kommt eine Fehlermeldung wegen "Skalarvariable" und nicht wegen fehlendem Parameter. Die Abfrage muss also so lauten:

    ODBC.ParamQuery("SELECT Name FROM Mitarbeiter WHERE Name = ? " &
                    "AND PIN = ? AND Lagerist = ? ", ODBCControl.Collation.CaseSensitive)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert RemoM Donnerstag, 10. März 2016 19:51
    Mittwoch, 2. März 2016 07:23
  • Hallo Olaf ,

    ich hatte mal mit ner ODBC Verbindung angefangen. Da ich noch nicht genau weiß ob das MobileBarcodeerfassungsgerät mit dem SQL Verbindungsstring klarkommt.

    Ich weiß nur das die ODBC Verbindung funktioniert.

    Vielen Dank für Deine Hilfe hab den Code so umgebaut und nun funktuioniert die Abfrage.

    Remo Maurer

    • Als Antwort markiert RemoM Donnerstag, 10. März 2016 19:51
    Mittwoch, 2. März 2016 22:28