Hallo an alle und besonders an Roland.
Anbei ein Demoprogramm für der Rückgabewerte bei "slExec", das gleichzeitig als Testprogramm für die Grundlagen von SQLite dient. Es geht dabei um die Rückgabewerte bei einem slExec - Befehl. Hier wird nur bei Select die Anzahl der gefunden Datensätze zurückgegeben sonst immer 0 (bei Fehlern Abbruch) Ist es hier möglich auch bei allen anderen Befehlen (Insert,Delete,Update,Count) einen Wert zu liefern oder vielleich gibt es das schon und ich weiß es nicht ?
steht bei SQLite : <Die Anzahl der von SQLExec bearbeiteten Datensätze ist das Ergebnis der Funktion und wird auch in &SQLCount zurückgeliefert. Trat ein Fehler auf, wird -1 zurückgegeben.> Dies schein aber nur über die ODBC-Schnittstelle zu funktionieren (habe ich aber nicht).
Dies wäre optimal das bei Fehlern -1 kommt und dann auch $SQLError gesetzt wird, sonst eben die Anzahl. Dadurch könnten dann fehlerhafte Befehle abgefangen werden ohne Programmabbruch. Besonders interessant ist das bei einem TRIGGER und RAISE wo bestimme Ereignisse abgefragt werden können und dann auch Meldungen erzeugt werden (siehe Programm beu DB_Open). Das Beispiel mit leeren Feld könnte man auch in Profan lösen, aber es gibt da bestimmt noch mehr Möglichkeiten. Als Anlage Bild der (Fehler)Meldung von SQL "Name ist leer"
' Testprogramm für SQLite, XProfan X4, Made by Herby
Declare grid&, g&, Text&, Ende&, ins&, leer&, Del&, such&, DB&
Declare zwi$, zwi%, erg%, Ende%
' Datenbank erzeugen, falls nicht vorhanden, und Verbindung herstellen ************
Proc DB_Open
ifnot fileexists("testdb.db")
db& = db("slCreate", "testdb.db")
Db("slExec", DB&, "CREATE TABLE Daten (Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Datum REAL)",1)
db("slExec", DB&, "INSERT INTO Daten (Id, Name, Datum) VALUES (1, 'Satz 1',JULIANDAY('NOW','LOCALTIME'))", 1)
' Trigger erstellen wenn Datensatz mit leeren Namen eingefügt wird, geht auch mit Delete, Update. Oder Logdatei erstellen bei Änderungen ...
Db("slExec", DB&, "CREATE TRIGGER Name_leer BEFORE INSERT ON Daten BEGIN SELECT CASE WHEN NEW.Name = '' THEN RAISE ( ABORT, 'Name ist leer') END; END;",1)
MessageBox("Datenbank neu erstellt","Hinweis",64)
else
db& = db("slInit", "testdb.db")
EndIf
EndProc
' alle Sätze aus Datenbank lesen und in Grid anzeigen ******************************
Proc DB_Read
ClearList 0
ClearList grid&, g&
erg% = Db("slExec", DB&, "SELECT Id, Name, DATE(Datum), TIME(Datum) FROM Daten",g&)
Printx "Lesen : ",erg%
Move("HandleToList",g&)' in Grid werden nur Datensätze eingetragen ohne Überschriften/Spaltenbeiten, darum über Grid !
Move("ListToHandle",grid&)' in GridBox werden die Überschriften und Spaltenbreite von SQL gesetzt
EndProc
' Text in ListBox ausgeben und auf letzte Zeile positionieren (Terminal) **********
Proc Printx
Parameters TEXT$,Nr%
AddString(Text&,TEXT$ + Str$(Nr%))
SelectString(Text&,GetCount(Text&)-1,"")
EndProc
cls
db("slUseDLL", "sqlite3.dll")' DLL initialisieren
DB_Open
g& = create("Grid",4,0)' hier werden Daten ohne Kopfzeile eingetragen
Grid& = Create("gridbox",%hwnd,"ID;0;30;Name;0;200;Datum;0;70;Zeit;0;70",0,200,20,400,200)
Text& = create("Listbox",%hwnd,0,20,20,150,200)
Del& = Create("Button",%hwnd,"Del",200,360,60,25)
Ins& = Create("Button",%hwnd,"Ins",300,360,60,25)
Leer& = Create("Button",%hwnd,"Leer",400,360,60,25)
Ende& = Create("Button",%hwnd,"Ende",500,360,60,25)
DB_Read
Randomize
WhileNot Ende%
WaitInput
If Clicked(Ende&)
Ende% = 1
ElseIf Clicked(Ins&)' Datensatz einfügen
ZWI$ = "Test " + Str$(Rnd(1000)+1)
erg% = Db("slExec", DB&, "INSERT INTO Daten (Name,Datum) VALUES (:zwi$,JULIANDAY('NOW','LOCALTIME'))",1)
Printx "Ins : ",erg%
DB_Read
SelectString(grid&,GetCount(grid&)-1,"")
ElseIf Clicked(Leer&)' Datensatz einfügen mit leeren Namen, bricht mit SQL-Error [19] ab, evtl erg% setzen ($sqlerror/&sqlcount ?!?)
erg% = Db("slExec", DB&, "INSERT INTO Daten (Name,Datum) VALUES ('',JULIANDAY('NOW','LOCALTIME'))",1)
Printx "Ins leer : ",erg%
DB_Read
ElseIf Clicked(Del&)' markierten Datensatz löschen
ZWI% = GetCurSel(grid&)
If ZWI% > -1
ZWI% = Val(GetText$(grid&,ZWI%,0))' Id aus selectierten Datensatz lesen
erg% = Db("slExec", DB&, "DELETE FROM Daten WHERE Id = :zwi%",1)
Printx "Del : ",erg%
DB_Read
SelectString(grid&,GetCount(grid&)-1,"")
EndIf
EndIf
EndWhile
DB("slDone", DB&)' Datenbank schließen
End
Grüße aus München vom Herby. |