sqlite -> unterminated string

  • Hallo zusammen,
    Ich möchte ein Abrechnungsprogramm schreiben und jeder meiner Kunden soll in einer Datenbank angelegt werden.
    Leider zeigt es mir beim Einschreiben in die Datenbank folgenden Fehler:
    : ==> Unterminated string.:

    Mein Code:

    [autoit]

    _SQLite_StartUp()
    $hDB = _SQLite_Open("xxx-DB.db")
    _SQLite_Exec ($hDB, "CREATE TABLE Tabelle (Name,Telefon,Adresse,Postleitzahl,Ort,Rechnungsart,RegNr);")

    [/autoit]


    ...

    [autoit]

    _SQLite_Exec ($hDB, "INSERT INTO Tabelle (Name,Telefon,Adresse,Postleitzahl,Ort,Rechnungsart,RegNr) VALUES ( '" & GUICtrlRead($Name) & "','" & GUICtrlRead($Nummer) & "','" & GUICtrlRead($Strasze) & "','" & GUICtrlRead($Postleitzahl) & "','" & GUICtrlRead($Wohnort) & "','Pauschale','0');")

    [/autoit]

    Edit: nun auch in formatierter Form :)
    Wäre nett wenn Ihr mir sagen könntet, warum dieser Fehler auftritt.
    Vielen Lieben Dank im Voraus
    Chungwarlet

    3 Mal editiert, zuletzt von chungwarlet (23. Juni 2013 um 12:54)

  • Könntest du deinen Code nochmal im "Quellcode"-Tab des Editor posten und evtl. mit einem anderen Browser?
    Da die Formatierung komplett zerissen wurde. ;)

    MfG

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Der Fehler liegt definitiv nicht in den geposteten Code Schnippseln. Poste das ganze Script und auch die ganze Fehlermeldung(en).

    Das Script hier funktioniert jedenfalls fehlerfrei und entspricht bis auf die ersetzten guictrlreads() deinem Script von oben. Selbst wenn das guictrlread scheitern sollte wäre syntaktisch noch alles ok und es würde eine Tabelle angezeigt werden.

    [autoit]


    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #include <array.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _SQLite_StartUp()
    $hDB = _SQLite_Open("xxx-DB.db")
    _SQLite_Exec ($hDB, "CREATE TABLE Tabelle (Name,Telefon,Adresse,Postleitzahl,Ort,Rechnungsart,RegNr);")
    _SQLite_Exec ($hDB, "INSERT INTO Tabelle (Name,Telefon,Adresse,Postleitzahl,Ort,Rechnungsart,RegNr) VALUES ( '" & _
    "name" & "','" & "Nummer" & "','" & "Strasze" & "','" & "Postleitzahl" & "','" & "Wohnort" & "','Pauschale','0');")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; show
    dim $aResult, $iRows, $iColumns
    $iRval = _SQLite_GetTable2d ($hDB, "SELECT * FROM Tabelle;", $aResult, $iRows, $iColumns)
    If $iRval = $SQLITE_OK Then _ArrayDisplay($aResult)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _SQLite_Close($hDB)
    _SQLite_Shutdown()

    [/autoit]

    EDIT:

    Problematisch wird es aber evtl., wenn einfache Anführungszeichen, Kommas oder andere SQL Befehle in die Eingabefelder der GUI eingegeben werden. Das würde ich an deiner Stelle überdenken. ;)
    Die folgende Eingabe ins Feld Nummer würde z.B. die Tabelle löschen und eine neue Tabelle erzeugen:

    Code
    ','','','','','');DROP TABLE Tabelle;CREATE TABLE w00t('ich hab deine tabelle','gelöscht

    Daher sollte man Usereingaben niemals unkontrolliert in ein SQL Statement übernehmen.

    3 Mal editiert, zuletzt von misterspeed (21. Juni 2013 um 16:25)

  • Die Fehlermeldung unterminated String bekommt man im übrigen, wenn eine Zeile des Scriptes länger als 4000 Zeichen ist.
    Die Zeile muss in solch einem Fall in mehrere aufgeteilt werden, siehe auch mein Scriptbeispiel oben...

    [autoit]


    $test = "4000 Zeichen" & _
    "weitere 4000 Zeichen"

    [/autoit]

    3 Mal editiert, zuletzt von misterspeed (21. Juni 2013 um 17:26)

  • So die Funktion:

    [autoit]

    func Angebot_1()
    ;Design der Datenerfassung des Kunden
    #Region ### START Koda GUI section ### Form=c:\users\leonard\desktop\philip\angebot.kxf
    $Angebot = GUICreate("Dameige: Klausmann", 901, 494, 194, 142)
    $Pic1 = GUICtrlCreatePic("C:\Users\leonard\Desktop\ZuSortierendeFotos\Logos\Logos\Logo_RGB.jpg", 656, 0, 241, 283)
    $Label1 = GUICtrlCreateLabel("Name des Kunden:", 16, 16, 125, 23)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Label2 = GUICtrlCreateLabel("Postleitzahl:", 16, 56, 83, 23)
    GUICtrlSetFont(-1, 12, 400, 0, "calibri")
    $Label3 = GUICtrlCreateLabel("Wohnort:", 368, 56, 64, 23)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Label4 = GUICtrlCreateLabel("Thema:", 368, 16, 52, 23)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Label5 = GUICtrlCreateLabel("Geschätzter Zeitraum:", 16, 176, 147, 23)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Name = GUICtrlCreateInput("Nachname Vorname", 168, 16, 185, 27)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    GUICtrlSetTip(-1, "Nachname Vorname")
    $Postleitzahl = GUICtrlCreateInput("", 168, 56, 185, 27)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Thema = GUICtrlCreateInput("", 464, 16, 121, 27)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Wohnort = GUICtrlCreateInput("", 464, 56, 121, 27)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $StatusBar1 = _GUICtrlStatusBar_Create($Angebot)
    _GUICtrlStatusBar_SetMinHeight($StatusBar1, 25)
    $WeiterButton = GUICtrlCreateButton("Weiter", 704, 351, 121, 33)
    $MonthCal1 = GUICtrlCreateMonthCal("2013/06/19", 16, 224, 287, 164)
    $Rechnung = GUICtrlCreateRadio("via Rechnung", 512, 264, 113, 17)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Pauschale = GUICtrlCreateRadio("via Pauschale", 360, 264, 113, 17)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Label6 = GUICtrlCreateLabel("-", 368, 173, 11, 33)
    GUICtrlSetFont(-1, 18, 400, 0, "Calibri")
    $Label7 = GUICtrlCreateLabel("Straße:", 16, 96, 49, 23)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Strasze = GUICtrlCreateInput("", 168, 96, 185, 27)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Label8 = GUICtrlCreateLabel("Hausnummer:", 368, 96, 94, 23)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Hausnummer = GUICtrlCreateInput("", 464, 96, 121, 27)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Date1 = GUICtrlCreateDate("2013/06/20 09:38:19", 176, 176, 185, 25)
    $Date2 = GUICtrlCreateDate("2013/06/20 09:38:19", 385, 176, 185, 25)
    $Nummer = GUICtrlCreateInput("", 168, 136, 185, 27)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    $Label9 = GUICtrlCreateLabel("Telefonnummer:", 16, 136, 110, 23)
    GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit][autoit][/autoit][autoit]

    ;Auswahl durch Angebot_1 & Speichern von Kundendaten

    [/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()
    Select
    Case $nMsg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $nMsg = $WeiterButton
    If BitAND(GUICtrlRead($Pauschale), $GUI_CHECKED) = $GUI_CHECKED Then
    _SQLite_Exec ($hDB, "INSERT INTO Tabelle (Name,Telefon,Adresse,Postleitzahl,Ort,Rechnungsart,RegNr) _
    VALUES ( '" & GUICtrlRead($Name) & "','" & GUICtrlRead($Nummer) & "','" & GUICtrlRead($Strasze) & "','" & GUICtrlRead($Postleitzahl) & "','" & GUICtrlRead($Wohnort) & "','Pauschale','0');")
    GUIDelete($Angebot)
    ExitLoop
    ElseIf BitAND(GUICtrlRead($Rechnung), $GUI_CHECKED) = $GUI_CHECKED Then
    _SQLite_Exec ($hDB, "INSERT INTO Tabelle (Name,Telefon,Adresse,Postleitzahl,Ort,Rechnungsart,RegNr) _
    VALUES ( '" & GUICtrlRead($Name) & "','" & GUICtrlRead($Nummer) & "','" & GUICtrlRead($Strasze) & "','" & GUICtrlRead($Postleitzahl) & "','" & GUICtrlRead($Wohnort) & "','Rechnung','0');")
    GUIDelete($Angebot)
    ExitLoop
    EndSelect
    WEnd

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]

    Fehler:
    [Blockierte Grafik: http://img5.fotos-hochladen.net/uploads/fehler3gacsurd72.png]


    Edit:
    Ist noch im Aufbaustadium :D

    Einmal editiert, zuletzt von chungwarlet (21. Juni 2013 um 21:41)

  • Hallo,

    der Fehler liegt in Zeile 61 - 62 und 66 - 67, die Anführungszeichen sind falsch bzw. nicht gesetzt.

    Edit: ein EndIf Fehlt in der Funktion

    Lg Kleiner

    Einmal editiert, zuletzt von Kleiner (21. Juni 2013 um 23:05)

  • Der Zeilenumbruch ist syntaktisch falsch und ein endif fehlt auch. So sollte es richtig sein:

    [autoit]


    Case $nMsg = $WeiterButton
    If BitAND(GUICtrlRead($Pauschale), $GUI_CHECKED) = $GUI_CHECKED Then
    _SQLite_Exec ($hDB, "INSERT INTO Tabelle (Name,Telefon,Adresse,Postleitzahl,Ort,Rechnungsart,RegNr) " & _ ; <----- bei einem Zeilenumbruch immer String mit " schließen, mit & _ verketten und neue Zeile mit " beginnen
    "VALUES ( '" & GUICtrlRead($Name) & "','" & GUICtrlRead($Nummer) & "','" & GUICtrlRead($Strasze) & "','" & GUICtrlRead($Postleitzahl) & "','" & GUICtrlRead($Wohnort) & "','Pauschale','0');")
    GUIDelete($Angebot)
    ExitLoop
    ElseIf BitAND(GUICtrlRead($Rechnung), $GUI_CHECKED) = $GUI_CHECKED Then
    _SQLite_Exec ($hDB, "INSERT INTO Tabelle (Name,Telefon,Adresse,Postleitzahl,Ort,Rechnungsart,RegNr) " & _ ; <----- bei einem Zeilenumbruch immer String mit " schließen, mit & _ verketten und neue Zeile mit " beginnen
    "VALUES ( '" & GUICtrlRead($Name) & "','" & GUICtrlRead($Nummer) & "','" & GUICtrlRead($Strasze) & "','" & GUICtrlRead($Postleitzahl) & "','" & GUICtrlRead($Wohnort) & "','Rechnung','0');")
    GUIDelete($Angebot)
    ExitLoop
    endif
    EndSelect
    WEnd

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]
  • Okay,:)

    Ziemlich dämlich ! ^^

    Es ist wohl einfach zu heiß um klar zu denken in meiner Dachgeschosswohnung :D

    Danke an alle !

  • Noch ne Frage,
    Mein SciTe highlighted die SQLite Befehle nicht ..
    Ich hab zwar folgendes eingebunden:

    [autoit]


    #include <SQLite.au3>
    #include <SQLite.dll.au3>

    [/autoit]

    aber er scheint die befehle auch nicht zu erkennen .. :/

    Wenn ich build, gibt er keinen Fehler an, doch wenn ich teste, gibt er mir an, dass

    Spoiler anzeigen

    C:\Users\leonard\Desktop\Philip\Philip Klausmann.au3 (182) : ==> Variable used without being declared.:
    _SQLite_Exec ($hDB, "INSERT INTO Kundendaten (Thema,Name,Telefon,Email,Adresse,Postleitzahl,Ort,RegNr,Rechnungsart) " & "VALUES ( '" & GUICtrlRead($Thema) & "','" & GUICtrlRead($Name) & "','" & GUICtrlRead($Nummer) & "','" & GUICtrlRead($Email) & "','" & GUICtrlRead($Strasze) & "','" & GUICtrlRead($Postleitzahl) & "','" & GUICtrlRead($Wohnort) & "','" & $RegNr & "','P');")
    _SQLite_Exec (^ ERROR


    dazugehöriger Code wie oben prepariert:

    Spoiler anzeigen
    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Select
    Case $nMsg = $GUI_EVENT_CLOSE
    GUIDelete($Angebot)
    Call("close")
    Case $nMsg = $WeiterButton
    If BitAND(GUICtrlRead($Pauschale), $GUI_CHECKED) = $GUI_CHECKED Then
    _SQLite_Exec ($hDB, "INSERT INTO Kundendaten (Thema,Name,Telefon,Email,Adresse,Postleitzahl,Ort,RegNr,Rechnungsart) " & _
    "VALUES ( '" & GUICtrlRead($Thema) & "','" & GUICtrlRead($Name) & "','" & GUICtrlRead($Nummer) & "','" & GUICtrlRead($Email) & "','" & GUICtrlRead($Strasze) & "','" & GUICtrlRead($Postleitzahl) & "','" & GUICtrlRead($Wohnort) & "','" & $RegNr & "','P');")

    ExitLoop
    ElseIf BitAND(GUICtrlRead($Rechnung), $GUI_CHECKED) = $GUI_CHECKED Then
    _SQLite_Exec ($hDB, "INSERT INTO Kundendaten (Thema,Name,Telefon,Email,Adresse,Postleitzahl,Ort,RegNr,Rechnungsart) " & _
    "VALUES ( '" & GUICtrlRead($Thema) & "','" & GUICtrlRead($Name) & "','" & GUICtrlRead($Nummer) & "','" & GUICtrlRead($Email) & "','" & GUICtrlRead($Strasze) & "','" & GUICtrlRead($Postleitzahl) & "','" & GUICtrlRead($Wohnort) & "','" & $RegNr & "','R');")

    #cs Test
    _SQLite_Query($hDB, "SELECT * From Kundendaten",$hQuery)
    _SQLite_FetchData ($hQuery, $aRow)
    MsgBox(0x40,"[INFO]",$aRow[1],$aRow[2],$aRow[3],$aRow[4],$aRow[5],$aRow[6],$aRow[7],$aRow[8],$aRow[9])

    #ce
    ExitLoop

    endif
    $RegNr = $RegNr+1
    GUIDelete($Angebot)
    call("Angebot_2")
    EndSelect
    WEnd

    [/autoit]


    Vielen lieben Dank für eure schnelle und gute Hilfe.
    Grüße
    Chungwarlet

  • Die Fehlermeldung ist doch eindeutig. Du verwendest die markierte Variable $hDB ohne sie zuvor deklariert zu haben. Da ich in deiner Funktion nirgendwo ein _sqlite_open() sehe, welches dir das DB Handle $hDB liefern würde nehme ich mal an, dass du das _sqlite_Open() erst machst nachdem function1() aufgerufen wird, oder aber du machst das _sqlite_Open() innerhalb einer anderen Funktion und hast das Handle welches in dieser Funktion erzeugt wird nicht global deklariert. Hier meine Vermutung wie dein Code ausschaut:

    [autoit]


    connect() ; verbindung mit DB herstellen
    function1() ; gui erzeugen und Einträge zur DB hinzufügen, hier tritt dein Fehler auf

    [/autoit][autoit][/autoit][autoit]

    func connect()
    $hDB = _sqlite_Open(...) ; diese Variable ist nur solange gültig bis die Funktion verlassen wird, da sie nicht global deklariert wurde
    endfunc

    [/autoit]


    Eine Warnung statt einem Fehler würdest du bei diesem Script erhalten ("variable possibly used without beeing declared"):

    [autoit]


    connect() ; verbindung mit DB herstellen
    function1() ; gui erzeugen und Einträge zur DB hinzufügen, hier tritt dein Fehler auf

    [/autoit][autoit][/autoit][autoit]

    func connect()
    global $hDB = _sqlite_Open(...) ; diese Variable ist global bekannt sobald diese Zeile ausgeführt wurde
    endfunc

    [/autoit]

    Grund für die Warnung: Theoretisch könntest du function1() aufrufen ohne zuvor connect() aufzurufen, deswegen warnt dich der Compilercheck.


    Richtig wäre es z.B. so:

    [autoit]


    global $hDB = connect() ; verbindung mit DB herstellen, die zurückgegebene lokale variable wird nun in einer globalen variable gespeichert und ist in allen anderen Funktionen bekannt
    if $hDB = 0 then exit msgbox(0,"Fehler","DB konnte nicht geöffnet werden!")
    function1() ; gui erzeugen und Einträge zur DB hinzufügen, hier tritt dein Fehler auf

    [/autoit][autoit][/autoit][autoit]

    func connect()
    local $hDB = _sqlite_Open(...) ; diese Variable ist nur solange gültig bis die Funktion verlassen wird, wir geben diese aber mit return zurück, somit lebt sie an anderer Stelle weiter
    return $hDB
    endfunc

    [/autoit]

    3 Mal editiert, zuletzt von misterspeed (22. Juni 2013 um 15:07)

  • Danke!
    Meine Variable war nicht global.
    srry, das ich so banale Probleme zur Zeit hab, aber ich muss bis Montag einigermaßen weiterkommen und mir ist es viel zu heiß hier ..

    Vielleicht sollte ich auch n bisschen mehr Zeit zum Fehler suchen verwenden anstatt alles gleich zu posten ^^

    Wie kann ich denn in SciTe einstellen das die SQlite sachen so hellblau markiert werden ?

    Grüße
    Chungwarlet

  • Wie kann ich denn in SciTe einstellen das die SQlite sachen so hellblau markiert werden ?


    Keine Ahnung wo du dein Scite her hast, aber wenn du Scite4Autoit von der Autoit Webseite herunterlädst sollten auch alle Standard und UDF Funktionen farbig gekennzeichnet werden. Ich vermute mal du hast das originale Scite ohne Autoit Syntax Anpassung?

  • Wenn du beim INSERT-INTO-Befehl, sowieso alle Attribute angibst, kannst du auch die Spaltennamen weglassen. Also so:

    [autoit]

    _SQLite_Exec ($hDB, "INSERT INTO Tabelle VALUES ('" & GUICtrlRead($Name) & "','" & GUICtrlRead($Nummer) & "','" & GUICtrlRead($Strasze) & "','" & GUICtrlRead($Postleitzahl) & "','" & GUICtrlRead($Wohnort) & "','Rechnung','0');")

    [/autoit]


    Und es heißt übriegens Strasse/Straße und nicht Strasze.

  • Zitat

    Und es heißt übriegens Strasse/Straße und nicht Strasze.

    Okay, 'ß' ist ungünstig, ist klar

    Wie unterscheidest du dann Massen von Maßen ?
    Ich hab in meinem Studium gelernt fürs Programmieren für 'ß' sz zu schreiben

    Siehe URL-name :
    http://www.duden.de/rechtschreibung/Strasze

    Weil Strasse wär zum Beispiel der Plural von Strass(so kleine Glassteine)

  • Das ist wie im Englischen. Dort hat ein Wort auch mehrere Bedeutungen. Es kommt dann auf die Aussprache und auf den Satz an, wo es verwendet wird.
    Aber danke wieder was gelernt.

  • Ich hab in meinem Studium gelernt fürs Programmieren für 'ß' sz zu schreiben

    Mich verwundert ein wenig, dass man euch nicht eher dazu geraten hat englische Variablennamen zu verwenden. Gerade in großen internationalen Unternehmen ist deutscher Quellcode eher hinderlich. Davon ab hat man dann keine solchen linguistischen Probleme mehr wenn es um Umlaute usw. geht. ;)