2017-03-12 2 views
0

Ich versuche, den Datenbankwert eines Elements, das ich in eine Listbox legte, in das Textfeld anzuzeigen. (vb.net)Wie ändere ich den Datentyp, um den Datentyp nicht zu stimmen in Kriterienausdruck

Meine Datenbank Tabellenname ist 'Productlog', in dieser Tabelle hat 3 Spalten, ProductID, Produktname und Preis. Ich habe den Produktnamen in einer Listbox angezeigt, die ich erstellt habe, jetzt versuche ich, die 3 Spalten in 3 Textfeldern anzuzeigen. Allerdings bekomme ich den Fehler "Datentyp nicht übereinstimmend in Kriterienausdruck" in meiner ExecuteReader-Zeile. Hier ist mein Code ist:

Public Class shop 
    Dim provider As String 
    Dim datafile As String 
    Dim connString As String 
    Dim myConnection As OleDbConnection = New OleDbConnection 

Private Sub listboxitems_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles listboxitems.SelectedIndexChanged 
    Dim lbconn As New OleDb.OleDbConnection("PROVIDER=Microsoft.ACE.Oledb.12.0; Data Source = C:\Users\USER PC\Desktop\orderDB1.accdb") 
    Dim lbcmd As New OleDb.OleDbCommand("SELECT productid, product, price FROM productlog WHERE productid =' & listboxitems.Text & ' AND product ='" & listboxitems.Text & "' AND price =' & listboxitems.Text & '", lbconn) 
    Dim lbreader As OleDbDataReader 

    lbconn.Open() 

    lbreader = lbcmd.ExecuteReader() 'error appearing right here' 
    While lbreader.Read 
     txtproductid.Text = lbreader.GetInt32("productid") 
     txtproduct.Text = lbreader.GetString("product") 
     txtprice.Text = lbreader.GetInt32("price") 


    End While 

    lbconn.Close() 

End Sub 

Basierend auf den anderen Fragen, die ich sah, könnte es sein, weil das productid "und‚Preis‘beiden ganzen Zahlen sind und was ich tue, ist für einen String. Ich habe versucht, die doppelten Anführungszeichen ('"& txtproductid.Text"') zu entfernen und sie in 'txtproductid.Text' umzuwandeln, basierend auf einer anderen Frage, die ich nachgeschlagen habe. Die andere Antwort, die ich sah, war die Zeichenfolge in eine Ganzzahl zu konvertieren - 'lbcmd.Parameters.AddwithValue ("@ productid", ConvertInt32 ("txtproductid.Text"))' nicht sicher, ob das korrekt ist, aber ich habe den gleichen Fehler bekommen . Wie kann ich diesen Fehler umgehen? Vielen Dank.

AKTUALISIERT Code:

Private Sub listboxitems_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles listboxitems.SelectedIndexChanged 
    Using lbconn As New OleDb.OleDbConnection("PROVIDER=Microsoft.ACE.Oledb.12.0; Data Source = C:\Users\USER PC\Desktop\orderDB1.accdb") 
     Using lbcmd As New OleDb.OleDbCommand("SELECT productid, product, price FROM productlog WHERE productid = ? AND product = ? AND price = ?", lbconn) 

      'Set your values here. The parameters must be added in the same order that they 
      'appear in the sql SELECT command 
      Dim prodidparam As New OleDbParameter("@productid", Me.txtproductid.Text) 
      Dim prodparam As New OleDbParameter("@product", Me.txtproduct.Text) 
      Dim priceparam As New OleDbParameter("@price", Me.txtprice.Text) 

      lbcmd.Parameters.Add(prodidparam) 
      lbcmd.Parameters.Add(prodparam) 
      lbcmd.Parameters.Add(priceparam) 

      'Open the connection 
      lbconn.Open() 

      Using lbreader As OleDbDataReader = lbcmd.ExecuteReader() 
       While lbreader.Read 
        txtproductid.Text = lbreader.GetInt32("productid").ToString() 
        txtproduct.Text = lbreader.GetString("product") 
        txtprice.Text = lbreader.GetInt32("price").ToString() 
       End While 
      End Using 
     End Using 
    End Using 

End Sub 
+0

Preis ist eher Dezimal oder Double nicht Int32 – Plutonix

+0

@Plutonix Ich legte 10,15 und 20 auf die Preisspalte auf meine drei Produkte, Wenn es tatsächlich ein Doppel oder ein Dezimal ist, wie würde ich den Datentyp ändern? – JermaineAIT

+0

@Plutonix Ich habe das Try and Catch versucht und es gab keine Fehler mehr. aber ich kann immer noch nicht die Textbox, um die Werte anzuzeigen. – JermaineAIT

Antwort

0

Sie nicht String-Verkettung verwenden sollten Ihre SQL-Abfrage zu erstellen, wie Sie hier tun werden. Das eröffnet Ihnen einen sql injection hack. Stattdessen sollten Sie eine parametrisierte Abfrage verwenden.

Versuchen so etwas wie dieses (nicht getestet):

Using lbconn As New OleDb.OleDbConnection("PROVIDER=Microsoft.ACE.Oledb.12.0; Data Source = C:\Users\USER PC\Desktop\orderDB1.accdb") 
    Using lbcmd As New OleDb.OleDbCommand("SELECT productid, product, price FROM productlog WHERE productid = ? AND product = ? AND price = ?", lbconn) 

     'Set your values here. The parameters must be added in the same order that they 
     'appear in the sql SELECT command 
     lbcmd.Parameters.Add("productid", OleDb.OleDbType.Integer).Value = 1234 
     lbcmd.Parameters.Add("product", OleDb.OleDbType.VarChar).Value = "value of product" 
     lbcmd.Parameters.Add("price", OleDb.OleDbType.Integer).Value = 999 

     'Open the connection 
     lbconn.Open() 

     Using lbreader As OleDbDataReader = lbcmd.ExecuteReader() 
      While lbreader.Read 
       txtproductid.Text = lbreader.GetInt32("productid").ToString() 
       txtproduct.Text = lbreader.GetString("product") 
       txtprice.Text = lbreader.GetInt32("price").ToString() 
      End While 
     End Using 
    End Using 
End Using 

Da Ihr Code OleDbConnection verwenden Sie können nicht benannte Parameter verwenden. Beachten Sie die Fragezeichen in der SELECT-Anweisung, die als Platzhalter für die Werte dienen.

Beachten Sie, dass wenn Sie OleDb verwenden, müssen Sie die Parameter in der gleichen Reihenfolge hinzufügen, wie sie in Ihrer SQL-Abfrage angezeigt werden.

Die Anweisungen Using ... End Using stellen sicher, dass die Verbindung, der Befehl und der Datenreader richtig angeordnet sind.

+0

Ich änderte den Code ein wenig bei der Add-Parameter Teil und erklärte prodidparam als new oledbparameter ("@ productid", me.txtprodid.Text) und dann lbcmd.parameter.add. (Prodidparam), aber immer noch nichts erscheint, aber keine Fehler .Vielleicht im falschen Sub? Ich den Code in Listbox selectedindexexchanged? – JermaineAIT

+0

Fügen Sie Ihren aktualisierten Code zu Ihrer Frage hinzu. Es ist schwer zu helfen, ohne es zu sehen. –

+0

oh ok. Ich habe versucht, es hier zu setzen. Es tut uns leid. – JermaineAIT

Verwandte Themen