Abfrage SQL und Textbox.Text

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von dbsystel.

    Abfrage SQL und Textbox.Text

    Hallo zusammen,
    und zwar habe ich folgendes Problem,
    ich möchte gerne eine Abfrage machen, die den Ihalt ausliest und in eine Textbox einträgt.
    Ich gebe die eine Nummer in die TextboxEingabe ein, und mir soll der passende Name dazu in der Textbox1 angzeigt werden.
    Ich meine die Abfrage müsste so aussehen:

    VB.NET-Quellcode

    1. SELECT Artikel_Name FROM Artikel WHERE Artikel_ID = (???)

    Nur wie kann ich die Abfrage ins Programm einbauen, und vorallem wie kann ich die (???) jedes mal ändern. Weil im Abfrage Generator
    ist das irgendwie immer ne feste zahl(Filter). Wie kann ich den die Abfrage in den Button einbinden?

    lg

    Edit by der_Kurt:
    Habe den doppelten Thread zusammengefügt.

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

    SQL-Abfrage

    1. "SELECT Artikel_Name FROM Artikel WHERE Artikel_ID =" & iArtikelnummer

    Wobei iArtikelnummer ein Integer ist und du vorher die Artnummer hier zugewiesen hast.

    Ansonsten nutz doch mal die Forumsuche da gibt es viel Beiträg dazu wie du SQL in dein Programm einbindest.
    ich weiss jetzt nicht wie du das meinst,
    also ich habe ein textbox wo ich die artikelnr eingebe, dann sucht er wie folgt ob die artikel nr existiert:

    VB.NET-Quellcode

    1. Dim Check = From Kasse In ArtikelProfile.Artikel _
    2. Where TextBoxEINGABE.Text = Kasse.Artikel_ID

    Wenn es die Gibt, dann soll der passende artikel name dazu gesucht werden, und in die Textbox1 eingetragen werden.
    Deswegen ist die Abfrage bis auf die Artikelnummer immer die selbe.
    Nur wie kann ich jetzt jedes mal die Artikelnummer neu zuweisen bei der abfrage?

    VB.NET-Quellcode

    1. SELECT Artikel_Name FROM Artikel WHERE Artikel_ID = ('hier die Eingabe aus der TextboxEingabe')

    Nur wie ändere ich jetzt jedes mal den Wert hinter "Artikel_ID ="?
    So hast du immer die Artikelnummer aus der Textbox in deinem SQL Statement.
    Ist nicht getestet nur so ausn Kopf geschrieben

    VB.NET-Quellcode

    1. Dim iArtikelnummer as Interger
    2. iArtikelnummer = -1
    3. if not String.Isnullorempty(TextBoxEINGABE.Text) then
    4. iArtikelnummer = Convert.ToInt32(TextBoxEINGABE.Text)
    5. end if
    6. if iArtikelnummer > 0 then
    7. "SELECT Artikel_Name FROM Artikel WHERE Artikel_ID =" & iArtikelnummer
    8. else
    9. MsgBox("Keine ArtNummer")
    10. end if
    Bleibt für mich nur noch die Frage, wo genau der Code rein muss, da ich wenn ich mit sql db arbeite, nur über den designer und den assisten arbeite, und keinen code selbst mache für die form.
    Könntest du mir auch noch sagen wo der Code jetzt hin muss.
    hi,
    danke habs ausprobiert und es hatb geklappt.
    nur noch eine frage, wie kann ich jetzt die abfrage benutzerdefinieren, sprich den @Param1 der erzeugt wurde, ändern, dass da dann z.B. TextBox1.Text steht.

    ' WHERE Artikel_ID=TextBox1.Text '

    lg
    Bei mir werden da immer TableAdapter generiert, die das ganze Zeug drinne haben.

    Etwa der ArtikelTableAdapter, wennich obige Query geadded habe, bietet dann zusätzlichen Methoden an, wie:

    VB.NET-Quellcode

    1. Public Function GetArtikelByArtikel_ID(Artikel_ID As Integer) As ArtikelDataTable
    2. 'und
    3. Public Sub FillArtikelByArtikel_ID(Table ArtikelDataTable, Artikel_ID As Integer)



    Ich code eiglich nie DBCommands händisch - ist mir viel zu aufwändig und unsicher.
    Ich kenne jetzt den Abfragegenerator nicht (schreib das lieber selber da bin ich dann sicher was passiert ^^), aber die Lösung ist im Prinzip sehr einfach: Eine Paramter-Abfrage selber programmieren als Function und an die Function den Inhalt der TextBox als String übergeben, die Function sollte dann den übergebenen String als Parameter für die Abfrage einfügen.

    Da ich jetzt keine Ahnung habe mit welchem Object-Modell Du den Zugriff auf die DB und vor allem auf welches DBMS gestaltest, kann ich Dir auch keinen Beispiel-Code geben. Aber normalerweise sollte jedes Modell über ein Command-Object verfügen in dem Du an die Eigenschaft CommandText die SQL-Abfrage mit dem Parameter-Placeholder und dann an die Paramter-Eigenschaft den Namen und den Value übergibst. Kannst das nach der Setzung der Eigenschaften dann meistens mit Methoden die Execute oder ähnlich heissen ausführen lassen.

    Oder Du baust gleich eine SQL-Statement dynamisch und führst es direkt aus:

    strSQL = "SELECT MeinFeldName FROM MeineTabelle WHERE ID = '" & MeineTextBox.Text & "'"

    Return DbcmdObj.Execute(strSQL)

    ... oder sowas in der Richtung. Mit DbcmdObj habe ich nur einen Placeholder-Namen für Dein Datenbank-Command-Object eingesetzt (aber Achtung dabei denn die Rückgabe ist meistens typunsicher als Object, musst also vor Verwendung noch durch DirectCast für die Umwandlung in den passenden Datentyp sorgen).

    Aber Achtung mit den Hochkommas die funktionieren nur wenn das ID-Feld den Datentyp Text hat. Ist es ein numerisches Feld dann musst Du die Hochkommas weglassen.

    Hoffe es war was hilfreiches dabei.

    Gruß

    Rainer

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

    erstmal danke für die antworten,
    also ich habe jetzt mal folgendes ausprobiert:

    VB.NET-Quellcode

    1. Dim strSQLText As New SqlClient.SqlCommand
    2. strSQLText.CommandText = ("SELECT Artikel_Name FROM Artikel WHERE Artikel_ID = '" & TextBoxEINGABE.Text & "'")
    3. strSQLText.BeginExecuteReader()
    4. strSQLText.EndExecuteReader(TextBox1.Text)

    Also es funktioniert zwar nicht, aber währe das ungefähr die Richtung die ich gehen muss, damit es funktioniert?? ?( ?(
    habe es geschafft! durch ein bissl stöbern im web und im forum habe ich dann passenden code gefunden, es könnte zwar bei der bearbeitung schneller sein, aber es ist ja nur ein kleines kassenprogramm. Hier erstmal der code:

    VB.NET-Quellcode

    1. Dim conn As SqlClient.SqlConnection
    2. conn = New SqlClient.SqlConnection
    3. conn.ConnectionString = "Data Source=.\SQLExpress;Integrated Security=true; AttachDbFilename=|DataDirectory|\Kasse.mdf;User Instance=true;"
    4. Dim myAdapter As New SqlClient.SqlDataAdapter
    5. Dim SQLAbfrage As String = "SELECT Artikel_Name FROM Artikel WHERE Artikel_ID = '" & TextBoxEINGABE.Text & "'"
    6. Dim myCommand As New SqlClient.SqlCommand
    7. myCommand.Connection = conn
    8. myCommand.CommandText = SQLAbfrage
    9. myAdapter.SelectCommand = myCommand
    10. Dim myData As SqlClient.SqlDataReader
    11. If IsNumeric(TextBoxEINGABE.Text) = False Then
    12. MsgBox("Es dürfen nur Zahlen eingegeben werden!")
    13. TextBoxEINGABE.Clear()
    14. TextBoxEINGABE.Focus()
    15. ElseIf IsNumeric(TextBoxEINGABE.Text) = True Then
    16. If Not Check.Count = 0 Then
    17. conn.Open()
    18. myData = myCommand.ExecuteReader()
    19. If myData.HasRows Then
    20. myData.Read()
    21. TextBox2.Text = myData(0)
    22. conn.Close()
    23. TextBoxEINGABE.Text = ""
    24. TextBoxEINGABE.Focus()
    25. Else
    26. End If
    27. Else
    28. MsgBox("Artikel Nr. nicht vorhanden!")
    29. TextBoxEINGABE.Clear()
    30. TextBoxEINGABE.Focus()
    31. End If
    32. End If

    :thumbsup: :thumbsup: :thumbsup:
    Weiss nicht ob für Dich von Interesse, aber mal so als kleiner Tip ... ich würde das etwas anders aufbauen.

    Das Connection-Object wirst Du vermutlich irgendwann bei fortschreitendem App-Umfang öfters mal brauchen und auch die Ausführung von Commands. Kapsel das doch lieber in einer eigenen Klasse. Optimalerweise in eine Vererbungshierachie ... als Basis die Klasse die die Connection verwaltet, diese vererbt an die Klasse weiter die die Command- und sonstige Standard-Prozeduren als eigene Methoden zur Verfügung stellt und die vererbt wiederum weiter an eine Klasse die die SQL-Statements die Du für Deine App brauchst verwaltet.

    Du tust Dich einfacher bei Änderungen/Wartung und hast bei mehrfacher Verwendung deutlich weniger Aufwand. Mal davon ab das Dein jetziger Code um rd. 50% schrumpft.

    Wäre jetzt einmalig ein etwas größerer Aufwand aber Du wirst es lieben lernen wenn Du öfters mal solche individuellen Aktionen mit dynamischen SQL-Statements durchführen musst oder Aktionen durchführen musst die Du nicht mehr über den Afragegenerator erstellen lassen kannst, z.B. dynamisch erzeugte Querys/Views an Hand von User-Filter-Kriterien die er komfortabel in einer Form einstellen/auswählen kann. ;)

    Das hantieren mit Datenbindung ist nett am Anfang und zum Einstieg, aber wenn Du anfängst ausführlicher mit der DB im Hintergrund umzugehen (dynamische Abfragen/Auswertungen, komfortable Suchfunktionalitäten u.ä.) wirst Du eh um die selbst gemachten Programmierung der Datenbankzugriffe irgednwann nicht drum herum kommen. Und spätestens dann kommst Du auch mit dem Zugriffshandling ins Schleudern wenn Du an unterschiedlichen Stellen im Code individuelle Zugriffe programmiert hast.

    Spätestens falls sich mal Änderungen am Zugriff ergeben wirst Du drei Kreuze schlagen die DB-Zugriffe in einer eigenen Klasse gekapselt zu haben. ^^

    Nur mal so als Anregung.

    Gruß

    Rainer