Unerklärlicher fehler bei Update Anweisung

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Kagurame.

    Unerklärlicher fehler bei Update Anweisung

    Moin liebe community ;)

    Ich fang grade mit SQL an und bekomme bei einer update Anweisung immer den gleichen Fehler: "Datentyp in Kriterienausdruck unverträglich"..
    das ist der Befehl:

    SQL-Abfrage

    1. Update Lieder set Name = '" & txtName.Text & "' where nr = " & nr.ToString


    das ganze steht in dem code:

    VB.NET-Quellcode

    1. Private Sub cmdOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOK.Click
    2. Try
    3. con.Open()
    4. cmd.CommandText = "Update Lieder set Name = '" & txtName.Text & "' where nr = " & nr.ToString
    5. cmd.ExecuteNonQuery()
    6. MsgBox("OK!")
    7. Catch ex As Exception
    8. MessageBox.Show(ex.Message)
    9. End Try
    10. con.Close()
    11. Me.close()
    12. End Sub


    Ich hab mir den text mit einer Messagebox ausgeben lassen:
    "Update Lieder set Name = 'HALLOO' where nr = 2"
    sollte doch passen..

    "Nummer 2" existiert und ich habe ein String angegeben...
    Ich glaub ich hab hier grad nen riesiges Brett vorm Kopf, weil ich den Fehler einfach nicht finde..

    Danke für jede Hilfe.. HerrBert
    Linux wird nie das meistinstallierte Betriebssystem sein. Bedenken Sie nur, wie oft man Windows neu installieren muss!
    :thumbsup:
    Beispiel:

    SQL-Abfrage

    1. Update `Tabelle` Set `Spalte` = 'Inhalt' Where `Eine Spalte` = 'Inhalt'


    Bei Spalten die Strings enthalten um den Spaltennamen `` machen, falls es nurn Integer ist die `` weglassen.

    Bei Spalten die Strings enthalten um den Inhalt `` machen, falls es nurn Integer ist die `` weglassen.

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

    Nein, bei Spaltennamen immer `` drum machen, damit SQL klar ist, das es Spaltennamen und keine SQL Befehle sind, z.B. würdest du Probleme bekommen wenn eine Tabelle oder Spalte Update heißen würde

    SQL-Abfrage

    1. UPDATE Update SET `irgendwas` = 'foo'

    => hier würde SQL mäckern

    SQL-Abfrage

    1. UPDATE `Update` SET `irgendwas` = 'foo'

    => hier nicht

    Hochkommas '' kommen um alle Typen außer Integern, also bei einer ID kannst du die '' weg lassen

    SQL-Abfrage

    1. UPDATE `Lieder` SET `Name` = 'HALLOO' WHERE `nr` = 2


    Zudem würde ich dir raten anzugewöhnen Sql Befehle groß zu schreiben, glaube mir, die Übersicht wirds dir später danken. So siehst du sofort was SQL Befehle und was was anderes ist, gerade bei langen Querystrings.
    Hi HerrBert,
    Wenn der Error heisst "Datetypen unverträglich", passt mit Sicherheit das Handling (von einem der Fedlnamen) nicht zum Datentype in der Tabelle, ich tippe mal auf "nr.ToString" WEil, im SqlString handelst du im WHERE Teil 'Nr' als Datentyp Zahl machts daraus aber eine string. Der Error würde auch kommen wenn 'Name' vom Datentyp Zahl ist(in der Tabelle) oder Datum oder irgendwas andres statt String
    @letzter Post: Beim lesen irgendwie durcheinander gekommen, kann es bitte einer Verständlich formulieren?
    Aber das was ich rauslesen konnte ist nicht direkt richtig... im SQL ist ein Integer ein Integer wenn keine " darum stehen, da du den ganzen Befhel als String mitgibst. Würde er, wie du sagst, einen String mitgeben, stünde da

    VB.NET-Quellcode

    1. ... '" & id.toString & "'" ...



    Des weiteren kann ich dir bei dem explizieten Problem leider nicht helfen gerade... da ich gerade nicht erkennen kann, welche datentypen du genau evrwendest, (ich erkenne nur ganz klar deinen String), bei nr erkennt man es beispielsweise nicht was es für ein Datentyp ist.

    Aber dennoch möchte ich dir den einen oder anderen Tip geben:

    Arbeite mit String.Format

    VB.NET-Quellcode

    1. public function Quote(sql as string) as string
    2. sql = sql.replace("'", "''") 'so kann keine SQL-Injection betreiben
    3. sql = String.Format("{0}{1}{2}", "[", sql, "]") '[ und ] macht das selbe wie ``, also hops wien satz gemacht was du davon verwendest.
    4. return sql
    5. end function
    6. ...
    7. Dim cmd As String = String.Format("UPDATE {0} SET {1} = {2} WHERE {3}", Quote("TableName"), Quote("AttributeName"), Quote("value"), bedingung)
    8. 'gerade denksperre, ob die bedingung auch unbedingt gequotet werden muss.... oder überhaupt so viel... aber bedenke den ansatz



    String.Format ist performanter als + und &... und übersichtlicher, und vor allem bessre zu refactoren oder Fehler suchen, finden und Variablen oder texte ändern.
    Auf der Basis kannst du dir auch eine Klasse machen, die das für dich macht und der es egal ist, welche tabelle du gerade lädst. Schaue dazu wenn du möchtest bei meinen Beiträgen mal "Daten effizient auslesen", dort ist einiges zu dem thema von mir, unter anderem eine ganze Hilfsklasse, zu der du dir, wenn du ja noch am lernen bist, sicher noch Infos aus dem Internet suchen kannst. Also nicht alles gemacht, sondern nur ein komplizierter Teil dessen, was ich veranstaltet habe... den rest findest du im internet und findest nebenher noch einiges, was du bei der Datenbank-programmierung gebrauchen kannst.

    Das ganze über try catch laufen zu lassen, finde ich ebenfalls unschön.

    Diese Methode zieht haufenweise RAM und vor allem kann der Nutzer nichts damit anfangen. Wenn du nicht in die Datenbank speichern kannst, weil du sie nicht erreichst, wirst du sie wohl auch bei Lesevorgängen nicht erreichen und sowas darf eh nicht passieren... dein Programm hat so keine Daten zum arbeiten in dem Fall und wird an anderer Stelle sterben. Und so ist es dann schwerer fehler zu finden, wenn das Programm an ganz anderer Stelle stirbt. Weil dann eventuell soviel durchlaufene Routinen dazwischen liegen, das überall was hätte schief laufen können.


    Sehr interessanter Link, danke ErfinderDesRats, du erklärst besser als ich ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kagurame“ () aus folgendem Grund: Fehler beim Quelltext - Darstellung / NewLine