Autor |
Beitrag |
D. Annies
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Do 04.02.10 20:27
Hi, Delpher,
wer kann mir mal sagen, warum ich die Meldung bekomme, dass es 0 Datensätze sind? (es sind 741)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| procedure TForm1.btnTestClick(Sender: TObject); var Notes: String; begin slDBPath := ExtractFilepath(application.exename) + 'dbSch.db'; sldb := TSQLiteDatabase.Create(slDBPath); showmessage('SchulTabAn geladen'); try if not sldb.TableExists('SchulTabAn') then begin sSQL := 'CREATE TABLE SchulTabAn ([Name] VARCHAR (50), [Vorname] VARCHAR (50), [Klasse] VARCHAR(10));'; sldb.execsql(sSQL);
sldb.BeginTransaction; sSQL := 'INSERT INTO SchulTabAn(Name,Vorname,Klasse) VALUES ("Annies","Detlef", "11a");'; sldb.ExecSQL(sSQL); sSQL := 'INSERT INTO SchulTabAn(Name,Vorname,Klasse) VALUES ("Annies","Almut", "11a");'; sldb.ExecSQL(sSQL); sldb.Commit; end else showmessage('Tabelle ' + 'SchulTabAn' + ' existiert');
sltb := slDb.GetTable('SELECT * FROM SchulTabAn'); showmessage(inttostr(sltb.count) + 'DS'); try if sltb.Count > 0 then begin showmessage(inttostr(sltb.count)); ebID.Text := ''; ebName.Text := sltb.FieldAsString(sltb.FieldIndex['Name']); showmessage('hi1'); ebNumber.Text := sltb.FieldAsString(sltb.FieldIndex['Vorname']); showmessage('hi2'); notes := sltb.FieldAsString(sltb.FieldIndex['Klasse']); showmessage('hi3'); memNotes.Text := notes; showmessage('hi4'); end else showmessage('keine DS'); finally sltb.Free; end; finally sldb.Free; end; end; |
Danke, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Do 04.02.10 21:26
Kommt wirklich kein Ergebnis, oder ist nur Count 0?
_________________ Markus Kinzler.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Do 04.02.10 21:45
Hi, Markus,
gute Frage:
Codeschnipsel:
Delphi-Quelltext 1: 2:
| sltb := slDb.GetTable('SELECT * FROM SchulTabAn'); showmessage(inttostr(sltb.count) + 'DS'); |
Also ich bekomme die Meldung: 0 DS siehe oben
??
_________________ ut vires desint, tamen est laudanda voluntas
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Do 04.02.10 21:51
Die Frage war aber, ob dieses Count auch stimmt. Bei manchen Zugriffskomponenten wird diese Eigenschaft nicht richtig gesetzt oder zeigt die Anzahl der gefetchten DS an.
_________________ Markus Kinzler.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Do 04.02.10 22:04
Ja Markus, da wird etwas nicht richtig angegeben, hast du eine Idee, wie es richtig und sicher gehen kann?
Gruß, Detlef
P.S.
ich habe jetzt mal gesetzt:
Delphi-Quelltext 1:
| sltb := slDb.GetTable('SELECT count (*) FROM SchulTabAn'); |
Jetzt sind (ist) es 1 (ein) Datensatz
ahu
_________________ ut vires desint, tamen est laudanda voluntas
Zuletzt bearbeitet von D. Annies am Do 04.02.10 22:11, insgesamt 1-mal bearbeitet
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Do 04.02.10 22:10
Explizit abfragen
_________________ Markus Kinzler.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Do 04.02.10 22:12
Oh, da hat sich was überschnitten, aber ich weiß leider nicht, wie du explizit meinst.
_________________ ut vires desint, tamen est laudanda voluntas
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Do 04.02.10 22:27
Genau das.
_________________ Markus Kinzler.
|
|
Bernhard Geyer
      
Beiträge: 721
Erhaltene Danke: 3
|
Verfasst: Do 04.02.10 22:34
Ich vermute das die TSQLiteDatabase einen "Serverseitigen" Curser verwendet (ist ja auch sinnvoll bei serverlosen DB wie Sqlite). Jedoch ist bei diesem Cursertyp die Count-Eigenschaft so lange ungültig/falsch bis du bis zum letzten Datensatz navigiert hast und die gesamten Datensätze am Client (hier in deinem sltb-Cache) gelandet ist. Nur bei einem synchronen clientseitigen Curser hast du sofort eine gültige Anzahl Count. Aber u.U. dauert das Öffnen der Query auch mehrer Sekunden (Minuten).
Bei richtigen SQL-Servern ist dies auch ein sehr gewünschtes Verhalten. Z.B. du hast eine Oracle-DB mit einigen TB an Daten. Deine Query würde sagen wir mal 100.000 Datensätze liefern und braucht bis zum vollständigen Aufbau (trotz 100 GB RAM und mehrern Quad-Cores) 10 Minuten. Jedoch willst du die Verarbeitung schon beim ersten Datensatz beginnen da dieser Unabhängig von den noch 99.999 weiter ist. So kann der Aufbau der Ergebnismenge parallel zur Abarbeitung im Client erfolgen.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Do 04.02.10 23:33
Hi, Bernhard, das war mir neu, aber du hast es gut erklärt.
Markus, dich verstehe ich explizit (noch) nicht.
Don't worry Det ..
_________________ ut vires desint, tamen est laudanda voluntas
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Do 04.02.10 23:48
Mit explizit meinte ich das select count ...
Und das was Berhard detailiert erklärt hat, war die Anzahl der gefetchten Records
_________________ Markus Kinzler.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Fr 05.02.10 07:00
Ah, jetzt weiß ich, wie du es gemeint hast, aber die DS-Anzahl wird ja immer noch nicht richtig ausgegeben.
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Fr 05.02.10 11:01
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Fr 05.02.10 14:29
Ach so,
danke, Robert
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Fr 05.02.10 22:37
Hi, Delpher,
so langsam bekomme ich die Krise: Habe ich denn SQLite3 falsch/unvollständig installiert?
Der folgende Code funktioniert noch immer nicht, obwohl er es - auch nach einem Script, das ich eingesehen habe- tun müsste.
Ich kenne es sonst so, dass noch ein Package installiert werden muss, das habe ich hier nicht, ich kann einfach Variable wie eine SQLiteQuery namens SQLiQy deklarieren, aber nicht entsprechend aufrufen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94:
| var Form1: TForm1; slDBpath: string; sldb : TSQLiteDatabase; sltb : TSQLiteTable; SQLiQy : TSQLiteQuery; sSQL : String; iID : integer;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject); begin opendialog1.InitialDir := ExtractFilepath(application.exename); showmessage(opendialog1.InitialDir);
end;
procedure TForm1.btnTestClick(Sender: TObject); var Notes : String; NrOfRecs : integer; begin slDBPath := ExtractFilepath(application.exename) + 'dbSch.db'; sldb := TSQLiteDatabase.Create(slDBPath); showmessage('SchulTabAn geladen'); try if not sldb.TableExists('SchulTabAn') then begin sSQL := 'CREATE TABLE SchulTabAn ([Name] VARCHAR (50), [Vorname] VARCHAR (50), [Klasse] VARCHAR(10));'; sldb.execsql(sSQL);
sldb.BeginTransaction; sSQL := 'INSERT INTO SchulTabAn(Name,Vorname,Klasse) VALUES ("Annies","Detlef", "11a");'; sldb.ExecSQL(sSQL); sSQL := 'INSERT INTO SchulTabAn(Name,Vorname,Klasse) VALUES ("Annies","Almut", "11a");'; sldb.ExecSQL(sSQL); sldb.Commit; end else showmessage('Tabelle ' + 'SchulTabAn' + ' existiert');
sltb := slDb.GetTable('SELECT count (*) As DSAnzahl FROM SchulTabAn'); showmessage(inttostr(sltb.count) + 'DS');
SQLiQy.SQL := 'select count(*) from SchulTabAn' ; sldb.ExecSQL(SQLiQy.SQL); showmessage(inttostr(NrOfRecs) + 'DS');
SQLiQy.SQL := 'SELECT * FROM SchulTabAn'; sldb.ExecSQL(SQLiQy.SQL); try if sltb.Count > 0 then begin showmessage(inttostr(sltb.count)); ebID.Text := '0'; showmessage('hi0'); ebName.Text := sltb.FieldAsString(sltb.FieldIndex['Name']); showmessage('hi1'); ebNumber.Text := sltb.FieldAsString(sltb.FieldIndex['Vorname']); showmessage('hi2'); notes := sltb.FieldAsString(sltb.FieldIndex['Klasse']); showmessage('hi3'); memNotes.Text := notes; showmessage('hi4'); end else showmessage('keine DS'); finally sltb.Free; end; finally sldb.Free; end; end;
procedure TForm1.AddSatzClick(Sender: TObject); begin sldb.BeginTransaction; sSQL := 'INSERT INTO SchulTabAn(Name,Vorname,Klasse) VALUES ("Annies","Detlef","11a");'; sldb.ExecSQL(sSQL); sldb.Commit; end;
|
So ein kleines Progrmmierbaby mit Datenbanken bin ich ja nun auch nicht mehr ...
Wer kann mir da raushelfen?
Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Fr 05.02.10 22:43
Und die Fehlermeldung?
Ich kenn SQL Lite nicht, aber muss man sltb nicht normalerweise vorher createn? Oder macht das GetTable automatisch?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 06.02.10 00:03
Hi, Xentar,
das habe ich jetzt auf deinen Hinweis hin auch mal gemacht, ohne Erfolg.
Ich hatte gedacht, SQLite könnte jetzt mal eine Alternative werden zur BDE,
aber KV.
Scheint ja auch nicht wirklich viele Benutzer davon zu geben, siehe Meldungen.
Bleibt wohl doch nur Firebird, oder?
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Sa 06.02.10 09:38
D. Annies hat folgendes geschrieben : | [...] Der folgende Code funktioniert noch immer nicht, [...] |
Sehr exakte Fehlerbeschreibung...
Zitat: | [...] Delphi-Quelltext 1: 2: 3: 4:
| SQLiQy.SQL := 'select count(*) from SchulTabAn' ; sldb.ExecSQL(SQLiQy.SQL); showmessage(inttostr(NrOfRecs) + 'DS'); |
[...] |
Sicher, dass ExecSQL die richtige Methode ist, wenn man eine Ergebnismenge zurückerwartet?
Und SQLiQy.Fieldbyname('DSAnzahl').AsInteger kann ja nicht funktionieren, wenn es in der Ergebnismenge gar kein Feld namens DSAnzahl gibt.
SQL-Anweisung 1:
| select count(*) AS DSAnzahl from SchulTabAn |
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 06.02.10 14:40
Dank für deine Mühe, Robert (und an die anderen) aber hier scheint mir ein
grundsätzlicheres Problem [bei mir] vorzuliegen.
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|