SQLlite DB als Datenbank verwenden ... Diskussionsthread

Moderator: Moderatoren

Antworten
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15008
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von brandelh » Mi, 17. Okt 2012 10:01

Hallo,

einen Beitrag für die Wissensdatenbank habe ich nicht, dafür fehlen noch die Lösungen.
Basierend auf der Wrapper Klasse von Pablo möchte ich aber mal anfangen,
vielleicht gelingt es uns öffentlich eine passende DBSERVER() Klasse zu erstellen.

Basis Wrapper von Pablo - darauf sollten wir aufbauen:

http://www.xbwin.com/forum.html

Code: Alles auswählen

Subject 	testing class sqlite3_xb
From 	   Pablo Botella
Date 	   Sat, 6 Feb 2010 14:25:00 +0100
Newsgroups 	   ot4xb.examples
Attachment(s) 	testsqlite.zip

require ot4xb 1.5.11.85 or higher
Recent messages in this thread 
Ehrlich gesagt bin ich von den vielen Methoden etwas erschlagen.
Bei Android werden Querys mit und ohne Rückgabewert benutzt. Hat jemand Erfahrungen mit der API von SQLite ?

Mir schwebt vor, dass Abfrageergebnisse aktuell nicht in einem Resultset sondern in Arrays zurückgeliefert werden sollten (damit kann jeder umgehen).
Natürlich jeweils mit UNIQUE ID in der ersten Spalte.
Methoden wie das Erzeugen etc. sollten Mit Array (wie z.B. dbstruct()) { { Feldname, Feldinhalt oder Suchbegriff } } aufgerufen werden.
Auf Xbase++ Seite sollte man also einfach Parameter an die Methode übergeben und diese übersetzt und escaped dann.

Hier gab es schon mal Diskussionen, aber ich wollte das Thema neu beleben ;-)
http://www.xbaseforum.de/viewtopic.php? ... lit=sqlite

Was meint Ihr ?
Dateianhänge
testsqlite.zip
(249.49 KiB) 103-mal heruntergeladen
Gruß
Hubert

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15008
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von brandelh » Mi, 17. Okt 2012 11:48

das hier ist die Erklärung der SQLite Schnittstelle von Basic4Android, da ich dieses für Android nutze, will ich mich daran orientieren.

http://www.basic4ppc.com/android/help/Help_SQL_D.htm
Gruß
Hubert

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 13661
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von Jan » Mi, 17. Okt 2012 12:22

Hubert,

ich habe mir mal dein Testprogramm runtergeladen. Das sieht ja soweit erstmal nicht allzu kompliziert aus. Allerdings müßte man damit die gesamte Struktur bestehender Programme umschreiben.

Ich stimme Dir aber zu, das ich ebenfalls etwas skeptisch bin was die Vorgehensweise von Aalska angeht. Ich finde es total genial, das ich SQL-Tabellen nutzen kann, indem ich meine gewohnten Zugriffsfunktionen nutzen kann. Ich habe aber keine Ahnung, wie sich dieses "konvertieren" auf die Performance auswirkt. Steffen hat uns ja einige Einblicke gewährt, wie das beim PostgreSQL funktioniert. Aber wie klappt das bei SQLite? Nach Aussage von Steffen wird ja der Zugriff nativ aus Arctica möglich sein, da der Quellcode von SQLite in Arctica integriert wurde (wenn ich das so korrekt verstanden habe). Aber wird der Zugriff auf SQlite dann ausschließlich über SQL-Syntax geschehen können, oder ebenfalls mit den DB-Funktionen?

Ansonsten wünsche ich mir sehr, das SQLite schnellstmöglichst zur Verfügung steht. Ich spiele mit dem Gedanken, mache Projekte darauf umzuschreiben. Infos dazu wären daher natürlich willkommen, aber leider gehen alle Alaska-Infos ja nur auf PostgreSQL. Schade.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7874
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von Tom » Mi, 17. Okt 2012 12:38

@Jan: Der Zugriff auf SQlite wird (vorerst?) nicht mit DB-Funktionen möglich sein, sondern nur über die SQL-Syntax und entsprechende Klassen. Der navigationsorientierte Ansatz funktioniert nur mit PostGre und nach erfolgter Konvertierung der Tabellen. Die Performance dürfte, wenn ich Steffen richtig verstanden haben, bei bis zu drei konkurrierend tätigen Arbeitsplätzen schlechter als mit DBF sein, danach sollte sie im Vergleich deutlich ansteigen. So ähnlich verhält es sich ja auch mit der ADS. Wenn ich direkt auf Dateien zugreife, und ich mache das konkurrenzlos und auf niedriger Ebene (direkt), muss ich schneller sein, als wenn noch Software (SQL-Server, ADS) dazwischenhängt. Mit ansteigender Konkurrenz geht dieser Vorteil verloren, da der Server damit beschäftigt ist, für zig mehrfach geöffnete Tabellen Handles zu verwalten, Daten zu lesen, zu schreiben usw. Das geschieht bei Vorhandensein eines Datenbankservers nicht mehr auf diese Weise.
Herzlich,
Tom

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 13661
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von Jan » Mi, 17. Okt 2012 12:48

Hallo Tom,

ja, so ungefähr habe ich mir das gedacht. Es gibt ja Gründe, warum Alaska gerade den PostgreSQL für Arctica ausgewählt hatte. Denn dort können über Stored Procedures und alle die anderen Möglichkeiten die DB-Zugriffsfunktionen wie etwa auf Indizee etc. abgebildet werden. Ich hatte schon geahnt, daß das mit SQLite nicht funktionieren wird.

Warum ich gerne auf SQLite umsteigen würde hat einen ganz einfachen Grund: So würde ich alle Tabellen in einer einzelnen Datei haben, statt der unzähligen Datenbanken und Indexdateien. Ohne gleich einen kompletten, für einen Normalanwender nicht administrierbaren "richtigen" SQL-Server wie PostgreSQL. Und das die Daten durch einfaches kopieren auf andere Datenträger übertragen werden können. Was so einfach ja auch mit anderen SQL-Servern nicht möglich wäre.

Mir ist dabei durchaus bewußt, das SQLite gegenüber den anderen SQL-Servern auch Nachteile hat, wie z. B. im Netzwerkbetrieb. Ich könnte mir aber vorstellen, daß das trotzdem eine elegante Möglichkeit ist. Muß ich halt testen, sobald das möglich ist. Irgendwann mal.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15008
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von brandelh » Mi, 17. Okt 2012 13:04

Jan hat geschrieben:Hubert,
ich habe mir mal dein Testprogramm runtergeladen.
zunächst eine Richtigstellung, das ist das Testprogramm bzw. die BasisKlasse von Pablo.

Falls man einen SQL Server hat (egal welchen) oder einen installieren kann (am Besten auf eigenem Rechner),
ist SQLexpress für mich die erste Wahl. Ein richtiger SQL-Server ist nicht nur schneller sondern auch sicherer.
UND durch das SQLexpress-Objekt ist keine ungewollte Nebenwirkung mit DBEs möglich.
SQL-Express macht mich hier unabhängig vom SQL Server, soweit ich das verstehe, ist die ODBC Schnittstelle selbst für
die Umwandlung von Escapes und Syntaxunterschieden zuständig, da kann ich mich aber auch täuschen, meine
Abfragen waren bisher nicht komplex.

SQLite() - sehe ich als DBF Ersatz wenn es eben nicht möglich bzw. erlaubt ist einen SQL Server zu stellen.

Ich persönlich möchte von der kompletten DBF/DBE Syntax weg und auf DatenObjekte (bzw. Resultsets) zugreifen.
Gerne schaufle ich in geringen Mengen auch in Arrays um, da ja die Cursor sich sehr unterschiedlich verhalten ...

Was die Performance angeht, mache ich mir keine Sorgen, 2 oder 3 PCs sollten nie ein Problem darstellen
und mehr als 20 gleichzeitige Benutzer habe ich nicht zu fürchten ;-)
Gruß
Hubert

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2569
Registriert: Fr, 08. Feb 2008 21:29

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von georg » Mi, 17. Okt 2012 13:13

Hallo,


SQLite ist dann im engeren Kreis für eine Auswahl, wenn es um Einzelplatz-Programme geht. Und da ist es - zumindest was ein von mir umgeschriebenes Programm angeht - deutlich schneller als FoxCdx. Das Programm liegt - mit den Dateien auf einem Novell-Server, und für das selektive Löschen von ca. 4.000 Sätze aus etwa 40.000 brauchte ich mit FoxCdx ca. 10 Minuten - SQLite erledigt das in weniger als einer Minute.

Ansonsten setze ich SQLite für kleine Hilfsprogramme ein, bei denen z.B. bestimmte Einstellungen abgespeichert werden müssen, aber sonst kein grosser Datentransfer stattfindet.

Ich habe auch mit Pablo's Klassen gearbeitet und werde mal meine Version hier einbringen.

Wichtig erscheint mir, dass in SQLite ein SELECT immer nur vorwärts gelesen werden kann, d.h. ein dbSkip(-1) ist nicht möglich. In einem solchen Fall muss man sich die ganzen Daten in ein Array laden und mit dem Array arbeiten, z.B. wenn man mit einem Browse operieren will/muss.

Dazu kommt, dass die SQLite Syntax an einigen Stellen deutlich eingeschränkt ist.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15008
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von brandelh » Mi, 17. Okt 2012 13:16

georg hat geschrieben:Dazu kommt, dass die SQLite Syntax an einigen Stellen deutlich eingeschränkt ist.
damit kenne ich mich aus, meine SQL Kenntnisse sind auch deutlich eingeschränkt :D
Gruß
Hubert

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15008
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von brandelh » Mi, 17. Okt 2012 17:09

Hi,

bei der Geschwindigkeit kommt es natürlich auch darauf an, dass man vor Massenoperationen BEGIN TRANSACTION selbst setzt und selbst COMMIT folgen läßt.
Hier mein erstes Beispiel:

Code: Alles auswählen

   ? "Erzeuge 1000 Sätze ohne begin transaction"
   @ row(),50 say str(0,4,0)+"%"
   for n := 1 to 1000
      if n % 10 = 0 // Dies hält nicht auf !
         @ 1,50 say str(n/10,4,0)+"% => "+str(n,4,0)
      endif
      stm := db:exec_begin("INSERT INTO t(name, vorname, strasse, plz, ort)  VALUES (:name, :vorname, :strasse, :plz, :ort)")
      db:bind_textO(stm ,":name","Name ÄÖÜ"+str(n,5))
      db:bind_textO(stm ,":vorname","VN äöü"+str(n,5))
      db:bind_textO(stm ,":strasse","Straße"+str(n,5))
      db:bind_textO(stm ,":plz",strZero(n,5))
      db:bind_textO(stm ,":ort","Ort /\[|]{}"+str(n,5))
      db:exec_end(stm)
   next
   @ 1,50 say str(100,4,0)+"%"
   ? "Dauer: ",seconds()-nStart

   nStart := seconds()
   ? "Erzeuge 1000 Sätze mit begin transaction"
   stm := db:exec_begin("BEGIN TRANSACTION")
   db:exec_end(stm)
   for n := 2001 to 3000
      stm := db:exec_begin("INSERT INTO t(name, vorname, strasse, plz, ort)  VALUES (:name, :vorname, :strasse, :plz, :ort)")
      db:bind_textO(stm ,":name","Name ÄÖÜ "+str(n,5))
      db:bind_textO(stm ,":vorname","Vorname äöü "+str(n,5))
      db:bind_textO(stm ,":strasse","Straße "+str(n,5))
      db:bind_textO(stm ,":plz",strZero(n,5))
      db:bind_textO(stm ,":ort","Ort /\[|]{}"+str(n,5))
      db:exec_end(stm)
   next
   stm := db:exec_begin("END TRANSACTION")
   db:exec_end(stm)
   ? "Dauer: ",seconds()-nStart
Jedesmal 1000 Datensätze anlegen, und hier die Laufzeiten in Sekunden:

120 Sekunden gegen 0,40 Sekunden über 250 mal schneller :!: :D
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12254
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von AUGE_OHR » Mi, 17. Okt 2012 22:27

hi,

ich hatte Hubert ja bei Pablo geantwortet, aber diese Information scheint nicht bekannt zu sein:
http://sqlite.org/whentouse.html#appfileformat
Situations Where Another RDBMS May Work Better

Client/Server Applications

If you have many client programs accessing a common database over a network, you should consider using a client/server database engine instead of SQLite. SQLite will work over a network filesystem, but because of the latency associated with most network filesystems, performance will not be great. Also, the file locking logic of many network filesystems implementation contains bugs (on both Unix and Windows). If file locking does not work like it should, it might be possible for two or more client programs to modify the same part of the same database at the same time, resulting in database corruption. Because this problem results from bugs in the underlying filesystem implementation, there is nothing SQLite can do to prevent it.

A good rule of thumb is that you should avoid using SQLite in situations where the same database will be accessed simultaneously from many computers over a network filesystem.
was ich "da" lese heisst : SqLite ist genau so "netzwerkfähig" wie DBF Dateien und hat die selben SMB Probleme.
gruss by OHR
Jimmy

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7874
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von Tom » Mi, 17. Okt 2012 22:41

was ich "da" lese heisst : SqLite ist genau so "netzwerkfähig" wie DBF Dateien und hat die selben SMB Probleme.
Es war und ist ja auch nicht für den Netzwerkeinsatz gedacht. SQLite wurde - mit verringertem Leistungsumfang und einigen anderen Einschränkungen - explizit für Single-User-Umgebungen und -Strukturen konzipiert, um SQL für solche Fälle nutzbar zu machen, etwa auf Mobiltelefonen und als lokale, anwendungsbezogene Datenbank. Es stellt eine simpel strukturierte, sequentiell arbeitende (Transaktionen werden also immer nacheinander bedient) SQL-Datenbank nahezu ausschließlich für den Einzelzugriff zur Verfügung. Rechte sind, sofern sie überhaupt beachtet werden, auf Betriebssystemebene angesiedelt, nicht innerhalb des Servers. Da Transaktionen grundsätzlich nacheinander abgearbeitet werden, gibt es auch keinen Bedarf an irgendwelchen Locking-Mechanismen, allerdings sollte es auch keine nachgeordneten Probleme (SMB und dieser Quatsch) geben. Firefox und Thunderbird etwa nutzen SQLite für ihre Datenhaltung, und hier gibt es keinen konkurrierenden Zugriff. Dafür ist das, um es noch einmal zu sagen, nicht gedacht - und auch ungeeignet.

Ach so: Die DBF-Dateien in Verbindung etwa mit den Xbase++-DBEs sind in dieser Verbindung sehr viel netzwerkfähiger als SQLite.
Herzlich,
Tom

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12254
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von AUGE_OHR » Mi, 17. Okt 2012 23:10

Tom hat geschrieben:Es war und ist ja auch nicht für den Netzwerkeinsatz gedacht.
danke für die Klarstellung denn Huber meinte ja
und mehr als 20 gleichzeitige Benutzer habe ich nicht zu fürchten
was sich so anhört als wenn er es im Netzwerk verwenden möchte statt DBF.
gruss by OHR
Jimmy

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7874
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von Tom » Mi, 17. Okt 2012 23:29

was sich so anhört als wenn er es im Netzwerk verwenden möchte statt DBF.
Das ist sehr wahrscheinlich keine gute Idee. Wenn es denn überhaupt zu schaffen ist, mit SQLite auf einem Server zu connecten. Was ich nicht glaube.
Herzlich,
Tom

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15008
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von brandelh » Do, 18. Okt 2012 8:56

Sorry wenn ich euch widersprechen muss, aber die ZITATE sollte man schon richtig lesen:

Code: Alles auswählen

SQLite will work over a network filesystem, but because of the latency associated with most network filesystems, performance will not be great.
ES IST geeignet um über ein Netzwerklaufwerk zu arbeiten :!:

ABER wegen Fehler bei den Netzwerk Dateisystemen und eventuellen Geschwindigkeitsproblemen sollte man - wenn möglich - einen anderen SQL Server nutzen.
Ich kann so aus dem Stehgreif nicht beurteilen, ob SQLite oder die DBE besser für Netzwerkumgebungen geeignet sind.

EIN riesen Problem stellt sich bei mir mit defekten Indexdateien, diese würde es bei SQLexpress schlicht nicht geben :!:
EIN anderes hat Jimmy angedeutet liegt darin, dass die DBF mit Offset gesperrt werden (was bisher ja kein Problem war), das macht SQLite nicht (gehe ich jetzt mal davon aus).
EIN weiteres hat Jimmy beschrieben liegt darin, wenn das OPLOCK Verfahren geändert wird (von einem auf zwei User), müsste der bisherige erste Client das sauber behandeln.
Ob SQLite das besser macht kann ich nicht beurteilen, aber einen Versuch ist es MIR wert ;-)

UND zum Schluß, ich will endlich eine Klasse die gekapselt ist von den DBEs, SQL kann und sich so verhält wie ich es mittlerweile gewohnt bin.

Wo liegt also EUER Problem damit ;-)

PS: die Kompatibilität mit den MySQL und PostgreSQL Klassen bleibt wohl wegen zu viel Aufwand auf der Strecke ;-)
Gruß
Hubert

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15008
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von brandelh » Do, 18. Okt 2012 11:06

So ich stelle mal mein erstes Testprogramm hier ein, zunächst hat Pablo einige Methoden um O (Original = UTF8)
und A (ANSI) erweitert, das gibt für uns aber Probleme bei OEM EXE Dateien - das will ich anders machen, aber zunächst eine Anpassung für OEM EXE und ANSI Protokoll :
(Pablo hat auch eine Methode die die Rückgabewerte gleich ins Zieldatenformat umwandelt.)

Code: Alles auswählen

#include "ot4xb.ch"
//----------------------------------------------------------------------------------------------------------------------
proc main()
   local db, n, i, nStart, nRecNr
   local stm,aa, nAnzTestRec := 100

   set charset to OEM  // äöü - wegen Anzeige in CMD Box

   delete file test.db // hier immer UTF8 !
   set alternate to test.txt
   set alternate on
   cls
   ?
   ? "Existiert test.db noch, trotz Löschung: ",file("test.db")
   ?
   nRecNr := 0
   db := TSqLiteDb():Open("test.db")
   aa := db:exec("SELECT sqlite_version()")
   if ! empty(aa) // NIL w„re m”glich
      ? "sqlite_version():  ",aa[1,1] , valtype(aa[1,1])
   else
      ? "sqlite_version():  ",aa
   endif
   ?
   if ! db:lIsTable("t")
      db:exec( "CREATE TABLE t (id integer PRIMARY KEY AUTOINCREMENT UNIQUE, name, vorname, strasse, plz, ort )" ) // keine Umlaute in Feldnamen (zumindest bei mir)
   end
   ? time(),"Erzeuge",nAnzTestRec,"S„tze ohne begin transaction"
   nStart := seconds()
   for n := 1 to nAnzTestRec
      @ row(),50 say n
      nRecNr++
      stm := db:exec_begin("INSERT INTO t(name, vorname, strasse, plz, ort)  VALUES (:name, :vorname, :strasse, :plz, :ort)")
      db:bind_textA(stm ,":name",   convToAnsiCP("Name ÄÖÜ "+str(nRecNr,5)))
      db:bind_textA(stm ,":vorname",convToAnsiCP("Vorname äöü "+str(nRecNr,5)))
      db:bind_textA(stm ,":strasse",convToAnsiCP("Straße "+str(nRecNr,5)))
      db:bind_textA(stm ,":plz",    strZero(n,5))
      db:bind_textA(stm ,":ort",                 "Ort /\[|]{}"+str(nRecNr,5))
      db:exec_end(stm)
   next
   ? "Dauer: ",seconds()-nStart
   ?
   ? "Erzeuge",nAnzTestRec,"Sätze MIT begin transaction" // Hinweis aus Basic4Android Forum
   nStart := seconds()
   stm := db:exec_begin("BEGIN TRANSACTION")
   db:exec_end(stm)
   for n := 1 to nAnzTestRec
      @ row(),50 say n
      nRecNr++
      stm := db:exec_begin("INSERT INTO t(name, vorname, strasse, plz, ort)  VALUES (:name, :vorname, :strasse, :plz, :ort)")
      db:bind_textA(stm ,":name",   convToAnsiCP("Name ÄÖÜ "+str(nRecNr,5)))
      db:bind_textA(stm ,":vorname",convToAnsiCP("Vorname äöü "+str(nRecNr,5)))
      db:bind_textA(stm ,":strasse",convToAnsiCP("Straße "+str(nRecNr,5)))
      db:bind_textA(stm ,":plz",    strZero(n,5))
      db:bind_textA(stm ,":ort",                 "Ort /\[|]{}"+str(nRecNr,5))
      db:exec_end(stm)
   next
   stm := db:exec_begin("END TRANSACTION")
   db:exec_end(stm)
   ? "Dauer: ",seconds()-nStart
   ?
   nStart := seconds()
   ? "Erzeuge 10000 Sätze mit begin transaction"
   stm := db:exec_begin("BEGIN TRANSACTION")
   db:exec_end(stm)
   for n := 1 to 10000
      @ row(),50 say n
      nRecNr++
      stm := db:exec_begin("INSERT INTO t(name, vorname, strasse, plz, ort)  VALUES (:name, :vorname, :strasse, :plz, :ort)")
      db:bind_textA(stm ,":name",   "Name    "+str(nRecNr,5))
      db:bind_textA(stm ,":vorname","Vorname "+str(nRecNr,5))
      db:bind_textA(stm ,":strasse","Strasse "+str(nRecNr,5))
      db:bind_textA(stm ,":plz",               strZero(n,5))
      db:bind_textA(stm ,":ort",    "Ort     "+str(nRecNr,5))
      db:exec_end(stm)
   next
   stm := db:exec_begin("END TRANSACTION")
   db:exec_end(stm)
   ? "Dauer: ",seconds()-nStart
   ? time(),"Suche alle die '55' im Namen haben ... "
   nStart := seconds()
   stm := db:exec_begin("SELECT id,name, vorname, strasse, plz, ort FROM t WHERE name like '%55%' ORDER BY ID")
   // aa  := db:exec_end_ex(stm,,,"IICI" )
   aa  := db:exec_end(stm)
   ? time(), "Treffer: ",len(aa),"   Dauer: ",seconds()-nStart
   wait
   ? "lfdNr. ID    ,Name         ,Vorname      ,Strasse      ,Plz  ,Ort"
   for n := 1 to len(aa)
     ? str(n,5)+":",str(val(aa[n,1]),6)
     for i := 2 to len(aa[n])
        ?? ",",cUtf8ToOem(aa[n,i]) // Texte sind noch in UTF8 !
     next
   next
   ? "Zeige die Tabellen in der Datei:"
   aEval( db:aTableNames() , {|a,i| qout(str(i,3)+".",a)} )
   ?
   set alternate to
   memowrit("test.txt",convtoAnsiCP(memoread("test.txt")))
   db:Close()
   inkey(10)
return
und das Ergebnis:

Code: Alles auswählen

Existiert test.db noch, trotz Löschung:  N

sqlite_version():   3.7.14.1 C

10:53:40 Erzeuge        100 Sätze ohne begin transaction
Dauer:          10,94

Erzeuge        100 Sätze MIT begin transaction
Dauer:           0,15

Erzeuge 10000 Sätze mit begin transaction
Dauer:           2,00
10:53:53 Suche alle die '55' im Namen haben ... 
10:53:53 Treffer:         282    Dauer:           0,03
Press any key to continue...
lfdNr. ID    ,Name         ,Vorname      ,Strasse      ,Plz  ,Ort
    1:     55, Name ÄÖÜ    55, Vorname äöü    55, Straße    55, 00055, Ort /\[|]{}   55
    2:    155, Name ÄÖÜ   155, Vorname äöü   155, Straße   155, 00055, Ort /\[|]{}  155
    3:    255, Name      255, Vorname   255, Strasse   255, 00055, Ort       255
    4:    355, Name      355, Vorname   355, Strasse   355, 00155, Ort       355
    5:    455, Name      455, Vorname   455, Strasse   455, 00255, Ort       455
    6:    550, Name      550, Vorname   550, Strasse   550, 00350, Ort       550
    7:    551, Name      551, Vorname   551, Strasse   551, 00351, Ort       551
    8:    552, Name      552, Vorname   552, Strasse   552, 00352, Ort       552
    9:    553, Name      553, Vorname   553, Strasse   553, 00353, Ort       553
   10:    554, Name      554, Vorname   554, Strasse   554, 00354, Ort       554
... 
  270:   9553, Name     9553, Vorname  9553, Strasse  9553, 09353, Ort      9553
  271:   9554, Name     9554, Vorname  9554, Strasse  9554, 09354, Ort      9554
  272:   9555, Name     9555, Vorname  9555, Strasse  9555, 09355, Ort      9555
  273:   9556, Name     9556, Vorname  9556, Strasse  9556, 09356, Ort      9556
  274:   9557, Name     9557, Vorname  9557, Strasse  9557, 09357, Ort      9557
  275:   9558, Name     9558, Vorname  9558, Strasse  9558, 09358, Ort      9558
  276:   9559, Name     9559, Vorname  9559, Strasse  9559, 09359, Ort      9559
  277:   9655, Name     9655, Vorname  9655, Strasse  9655, 09455, Ort      9655
  278:   9755, Name     9755, Vorname  9755, Strasse  9755, 09555, Ort      9755
  279:   9855, Name     9855, Vorname  9855, Strasse  9855, 09655, Ort      9855
  280:   9955, Name     9955, Vorname  9955, Strasse  9955, 09755, Ort      9955
  281:  10055, Name    10055, Vorname 10055, Strasse 10055, 09855, Ort     10055
  282:  10155, Name    10155, Vorname 10155, Strasse 10155, 09955, Ort     10155
Zeige die Tabellen in der Datei:
  1. sqlite_sequence
  2. t
FAZIT:

JEDE einzelne Schreiboperation wird als Transaktion behandelt, solange man nicht selbst eine Transaktion einleitet.
Davon können wir unter DBF nur träumen !
Schnell ist es auch, wobei die Daten hir lokal liegen und noch kein konkurierender Zugriff stattgefunden hat, aber immerhin.

UND man könnte die SQLite Tabelle auch im RAM halten wenn man wollte.

PS: wer einen SQLite Dateimanager braucht, ich nehme diesen hier - ich finde ihn gut :

http://sqlitebrowser.sourceforge.net/
http://sourceforge.net/projects/sqlitebrowser/
Dateianhänge
GrundTest1.ZIP
So zum warm werden ...
(482.16 KiB) 87-mal heruntergeladen
Gruß
Hubert

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15008
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von brandelh » Do, 18. Okt 2012 15:52

Tom hat geschrieben:Ach so: Die DBF-Dateien in Verbindung etwa mit den Xbase++-DBEs sind in dieser Verbindung sehr viel netzwerkfähiger als SQLite.
und hat mal wieder Recht behalten ;-)

SQLite legt fürs Journal eine Datei an, die sich aus dem Dateinamen ableitet (der UNC Pfad war kein Problem).
Es gibt wohl verschiedene Einstellungen die man - beim neu compilieren der DLL ändern könnte - aber ...

Bei meinem massiven Netzwerktest (auf 3 Rechnern warten jeweils 3 EXE bis ich eine Datei umbenenne und wollen je 1000 Datensätze anlegen - so schnell tippt keiner).
Ich hatte Abfragen und Schleifen eingebaut um auf Fehler zu reagieren, aber es stirbt eine Xbase++ EXE nach der Anderen weg.
Die eine, die die Nase vorne hatte erledigt die Aufgabe und beendet dann.

Nach den Unterlagen können zwar mehrere gleichzeitig LESEN, aber fürs Schreiben wird standardmäßig die komplette Datei gesperrt.
Selbst wenn nicht, Fehler beim Sperren kann auch diese DLL nicht abfangen. :wink:
Gruß
Hubert

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2569
Registriert: Fr, 08. Feb 2008 21:29

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von georg » Do, 18. Okt 2012 17:45

Hallo,


für solche Brute Force Einsätze ist SQLite nicht geeignet, und wo schon ein Netzwerk vorhanden ist, sollte man überlegen, auf einem Rechner MySQL oder PostGreSQL zu installieren.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15008
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von brandelh » Fr, 19. Okt 2012 9:01

Hallo Georg,

hast du deine Routinen mit einer Fehlerbehandlung ausgestattet ?

Bei Basic4Android muss man die Anweisung in einen Errorhandler setzen:

Code: Alles auswählen

SQL1.BeginTransaction
Try
    'block of statements like:
    For i = 1 to 1000
        SQL1.ExecNonQuery("INSERT INTO table1 VALUES(...)
    Next
    SQL1.TransactionSuccessful
Catch
    Log(LastException.Message) 'no changes will be made
End Try
SQL1.EndTransaction
Ich vermute (weiß es aber nicht), dass ein einzelner aufruf von EXEC(), der ja die Transaktion direkt setzt
bei einem Fehler einfach ein Rollback macht oder ?
Die Klasse müsste also im Fehlerfall zunächst eine zufällig Zeitspanne warten und es bis zu x mal versuchen,
danach kommt eine Fehlermeldung bzw. ein Fehler-Rückgabewert, damit die Anwendung reagieren kann.
Bei 5 oder auch 20 Usern mit Dateneingabe wird ja nur ab und zu Daten gelesen und geschrieben, meist wartet der Rechner auf Eingaben.

Wobei sich hier ja gleich wieder das Problem der lost updates ergibt, müsste man nicht - auch bei einem richtigen SQL Server - eine Art von
Zähler einbauen und vor dem Schreiben prüfen ob der alte Zähler noch identisch ist ?
Gruß
Hubert

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2569
Registriert: Fr, 08. Feb 2008 21:29

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von georg » Fr, 19. Okt 2012 9:23

Hallo, Hubert -


bei mir tritt (wenn, dann) meist beim :exec() ein Timeout auf, das ich dann abfange. Und zwar genau nach dieser Anweisung:

Code: Alles auswählen

result := @sqlite3:sqlite3_prepare_v2(::hdb,cSql,-1,@pStm,0)
Gestern plagte mich ein result == 21 ... bis ich die Definition gefunden hatte, die mir sagte, dass ich die Verbindung geschlossen hatte und dann doch noch ein Statement absetzen wollte ...
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12254
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von AUGE_OHR » Sa, 20. Okt 2012 3:14

brandelh hat geschrieben:Sorry wenn ich euch widersprechen muss, aber die ZITATE sollte man schon richtig lesen:

ES IST geeignet um über ein Netzwerklaufwerk zu arbeiten :!:

Wo liegt also EUER Problem damit ;-)
ich habe doch extra den Teil "FETT" markiert was mir bei dem Zitat wichtig erscheint.
es wird sich im Netzwerk genauso "schlecht" wie jedes andere File basierende System (DBF) auswirken.
ob man da auch mit den "Tricks" arbeiten kann ... ich habe "das" noch nicht ausprobiert.

SqLite ist eben kein Client/Server System und sollte deshalb IMHO nicht im Netzwerk "so" verwendet werden.
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15008
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von brandelh » Sa, 20. Okt 2012 16:12

dem kann ich zustimmen ;-)

Allerdings ist das was man nicht sollte und das was nicht möglich ist nicht immer das Gleiche ;-)
Gruß
Hubert

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2569
Registriert: Fr, 08. Feb 2008 21:29

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von georg » Sa, 20. Okt 2012 18:22

Hallo,


es kommt doch immer auf die Umstände und die Anforderungen an. Zur Not kann man auch mit dem Akkuschrauber einen Nagel in die Wand hauen ...

Ich bekomme für ein Projekt keine Datenbank auf einem unserer vielen SQL-Server, und FOXCDX ist über das Novell-Netzwerk einfach zu langsam. Also habe ich das Programm auf SQLite umgestellt, es wird normalerweise an zwei Tagen im Monat von einem Mitarbeiter ausgeführt, produziert etliche Auswertungen.

Es ist also eine klassische Single-User Anwendung mit vielen Gruppenwechseln, Untermengen von Daten etc. etc.

In diesem Fall war SQLite einfach das Mittel der Wahl, weil ich so viele komplexe Schleifen einfach in die SELECT Anweisung verlagern konnte.

Auch aufgrund der wenigen Datentypen (Datum, Zahlen, kurze Strings) habe ich mit den Einschränkungen von SQLite kein Problem.

Andere Aufgaben löse ich mit dem Mittel, das der Lösung am nächsten kommt. Und da finde ich es gut, mit SQLite ein Werkzeug für einen solchen Zweck zu haben.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15008
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLlite DB als Datenbank verwenden ... Diskussionsthread

Beitrag von brandelh » So, 21. Okt 2012 8:52

=D> :D
Gruß
Hubert

Antworten