Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQLite ganz einfach (via Unit).. wie ? [D6] (https://www.delphipraxis.net/188727-sqlite-ganz-einfach-via-unit-wie-%5Bd6%5D.html)

myicq 31. Mär 2016 11:36

Datenbank: SQLite • Version: 3 • Zugriff über: unit

SQLite ganz einfach (via Unit).. wie ? [D6]
 
Beginner-Frage .. ;)

ich möchte gern ganz einfach in eine Form meine SQLite-DB in Wert abfragen. Sprich: key suchen, Wert auslesen. Also ganz einfach.

Ich benutze Tim Andersons "a real simple SQLite Wrapper" [http://www.itwriting.com/blog/?page_id=659]

Meine Idee währe:
Ich habe Unit Mainform und Unit Utility (mit versch. Funktionen).
In Utility möchte ich (ein mal) bei Programmstart meine SQLite öffnen und dann in meine Mainform einfach eine Query abrufen.

Ungf. so:
Delphi-Quellcode:
unit Utility
...
var
  sqlitedb: TSqliteDatabase;
 
  procedure SQLiteInitialize(databasefilename);  // einmal bei Programmstart
  function SQLiteQuery(q as string): string;    // wert auslesen
  procedure SQLiteDestroy;                       // bei programmende

implementation
..
Problem ist: ich bekomme immer eine Access Violation.

Ich möchte gern SQLiteQuery so einfach wie möglich halten, etwa wie
Delphi-Quellcode:
   for i:=1 to 100 do
     res:=SQLiteQuery('select [myvalue] from [table] where key=' + searchkey);


Hoffentlich habe ich alles korrekt erklärt. Sonnst einfach zusagen, dann Poste ich was ich soweit habe.

BUG 31. Mär 2016 11:50

AW: SQLite ganz einfach (via Unit).. wie ? [D6]
 
Zitat:

Zitat von myicq (Beitrag 1334310)
Problem ist: ich bekomme immer eine Access Violation.

Und wie können wir dir dabei helfen, dieses Problem zu lösen?
Der Kontext drumherum ist ja ganz interessant, aber zu deinem konkreten Problem hast du fast keine Informationen gegeben :stupid:

mkinzler 31. Mär 2016 11:55

AW: SQLite ganz einfach (via Unit).. wie ? [D6]
 
Unterstützt der Wrapper (SQL-)Parameter?

p80286 31. Mär 2016 12:21

AW: SQLite ganz einfach (via Unit).. wie ? [D6]
 
Zeig doch mal den realen Source-Text. Der verursacht ja schließlich den Fehler.
Bei 'AccessViolation' tippe ich zunächst einmal darauf, daß da irgendwo ein
Delphi-Quellcode:
.Create
fehlt.

Gruß
K-H

myicq 31. Mär 2016 12:46

AW: SQLite ganz einfach (via Unit).. wie ? [D6]
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bin bisschen weitergekommen.. sehe Beispil im Anhang.

Habe ich das ganze so etwa korrekt verstanden ?

Wir würdet ihr Fehlerzustände umgehen (zb Datenbank nicht gefunden etc).

Wir überprüfe ich in function dbquery(q:string):string; ob der sqdatabase initialisiert ist ? Ich vermute eine "if sqdatabase then .." nicht gehen wird.

Aviator 31. Mär 2016 13:54

AW: SQLite ganz einfach (via Unit).. wie ? [D6]
 
Zitat:

Zitat von myicq (Beitrag 1334323)
Wir würdet ihr Fehlerzustände umgehen (zb Datenbank nicht gefunden etc).

Also zuallererst solltest du mit FileExists() überprüfen, ob die Datei existiert. Wenn du dann die Datenbank geöffnet hast, dann ist die Datei im Normalfall gesperrt, sodass diese nicht mehr gelöscht/umbenannt/verschoben werden kann. Ich habe das trotzdem mit Hilfe eines Programmes mal nachgestellt und den Zugriff auf die Datei gekillt. Mein Programm wirft dann eine Fehlermeldung "disk I/O error" (SQLite Fehlercode 10) aus. Die DLL schützt sich somit also selbst vor dem Zugriff auf eine nicht (mehr) existierende Datenbank. Du musst dann nur noch entsprechend die Fehlermeldung auslesen und ggf. ausgeben.

Ich habe mir einen eigenen Wrapper für die DLL geschrieben und noch ein paar DLL-Aufrufe hinzugefügt, die in der von dir verwendeten Unit nicht existieren. Entweder weil es diese noch nicht gab als der Wrapper geschrieben wurde oder weil der Autor des Wrappers diese für nicht sinnvoll angesehen hat. In meinen Augen sind das aber sehr wichtige Funktionen wenn man tiefer in die Datenbank eingreifen will und nicht nur Daten einer Tabelle auslesen will.

myicq 31. Mär 2016 14:35

AW: SQLite ganz einfach (via Unit).. wie ? [D6]
 
Zitat:

Zitat von Aviator (Beitrag 1334328)
Also zuallererst solltest du mit FileExists() überprüfen, ob die Datei existiert.

Klar, verstehe ich, und habe ich schon gemacht.

Wichtiger ist: wie überprüfe ich ob sqldatenbank schon initializiert wurde ?


Zitat:

Zitat von Aviator (Beitrag 1334328)
Ich habe mir einen eigenen Wrapper für die DLL geschrieben und noch ein paar DLL-Aufrufe hinzugefügt, die in der von dir verwendeten Unit nicht existieren.

Hast du das irgendwo zur verfügung gestellt ?

Zitat:

Zitat von Aviator (Beitrag 1334328)
Entweder weil es diese noch nicht gab als der Wrapper geschrieben wurde oder weil der Autor des Wrappers diese für nicht sinnvoll angesehen hat. In meinen Augen sind das aber sehr wichtige Funktionen wenn man tiefer in die Datenbank eingreifen will und nicht nur Daten einer Tabelle auslesen will.

Na gut, das auslesen würde mir so weit ausreichen. Zweck: ich werde alte routinen für .INI dateien ersetzen - die sind von andere schlecht programmiert und auch langsam.

Edit:

wenn ich in meiner Code "per Zufall" die Initialization auslasse, also
Delphi-Quellcode:
procedure databaseinit(filename: string);
begin
//  sqdatabase := TSQLiteDatabase.Create(filename);
end;
dann bekomme ich auch mit test eine Access Violation:
Delphi-Quellcode:
function dbquery(q:string):string;
var
  T: TSQLiteTable;
begin
  try
    if Assigned(sqdatabase) then    // <<<< geht leider nicht..
    begin
      t:=sqdatabase.GetTable(q);
      // records ?
      if t.Count>0 then
      begin
           Result:=t.FieldAsString(0);
      end;
    end
    else
        Result:='!!';
   finally
     t.free;
   end;
end;
das ist was ich meine mit Fehlersuche / test.

p80286 31. Mär 2016 15:47

AW: SQLite ganz einfach (via Unit).. wie ? [D6]
 
Zitat:

Zitat von myicq (Beitrag 1334333)
Wichtiger ist: wie überprüfe ich ob sqldatenbank schon initializiert wurde ?

Gegenfrage, was verstehst Du unter "nicht initialisiert"?
nach meinem Verständnis funktioniert die Abfrage und liefert ein (null) Ergebnis oder eben nicht.
Wenn nicht dann stelle ich die Verbindung zur DB her, und wenn danach die Abfrage immer noch kein Ergebnis liefert, dann muß sich jemand kümmern.

Gruß
K-H

DeddyH 31. Mär 2016 15:50

AW: SQLite ganz einfach (via Unit).. wie ? [D6]
 
Und die AV dürfte von der nicht initialisierten lokalen Variablen T herrühren. Was passiert denn, wenn Du sie gleich am Anfang mit nil vorbelegst?

myicq 31. Mär 2016 16:02

AW: SQLite ganz einfach (via Unit).. wie ? [D6]
 
Zitat:

Zitat von DeddyH (Beitrag 1334349)
Was passiert denn, wenn Du sie gleich am Anfang mit nil vorbelegst?

Na also. Ich habe noch sehr viel zu lernen.. Denke ich muss erst mit gehen vor ich laufe. Danke! So einfach kann es sein.

Delphi-Quellcode:
var
  sqdatabase: TSQLiteDatabase = nil;         // <<<<<<

..

function dbquery(q:string):string;
var
  T: TSQLiteTable;
begin
  t:=nil;
  try
    if sqdatabase<>nil then      // <<<<<<
    begin

Danke für Verständniss für Anfänger :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz