AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQLite ganz einfach (via Unit).. wie ? [D6]

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

Ein Thema von myicq · begonnen am 31. Mär 2016 · letzter Beitrag vom 31. Mär 2016
Antwort Antwort
Seite 1 von 2  1 2   
myicq

Registriert seit: 5. Jan 2016
70 Beiträge
 
Delphi 6 Professional
 
#1

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

  Alt 31. Mär 2016, 11:36
Datenbank: SQLite • Version: 3 • Zugriff über: unit
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.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

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

  Alt 31. Mär 2016, 11:50
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.820 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 31. Mär 2016, 11:55
Unterstützt der Wrapper (SQL-)Parameter?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

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

  Alt 31. Mär 2016, 12:21
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 .Create fehlt.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
myicq

Registriert seit: 5. Jan 2016
70 Beiträge
 
Delphi 6 Professional
 
#5

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

  Alt 31. Mär 2016, 12:46
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.
Angehängte Dateien
Dateityp: zip SQLite_working.zip (302,1 KB, 16x aufgerufen)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.607 Beiträge
 
Delphi 10.3 Rio
 
#6

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

  Alt 31. Mär 2016, 13:54
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.
  Mit Zitat antworten Zitat
myicq

Registriert seit: 5. Jan 2016
70 Beiträge
 
Delphi 6 Professional
 
#7

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

  Alt 31. Mär 2016, 14:35
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 ?


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 ?

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.

Geändert von myicq (31. Mär 2016 um 15:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

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

  Alt 31. Mär 2016, 15:47
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.367 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 31. Mär 2016, 15:50
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
myicq

Registriert seit: 5. Jan 2016
70 Beiträge
 
Delphi 6 Professional
 
#10

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

  Alt 31. Mär 2016, 16:02
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf