SQL Abfrage im Hintergrund

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQL Abfrage im Hintergrund

Beitrag von Kiffi »

Mr.Vain hat geschrieben:Ebenso möchte ich, dass diese Abfrage jede 5 Minuten ausgeführt wird.
dafür verwendest Du am besten einen Timer.
Einfach mal AddWindowTimer() in Deine IDE eintippen
und <F1> drücken. Der dann erscheinende Hilfe-Text
enthält alles was Du für das Verständnis brauchst

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: SQL Abfrage im Hintergrund

Beitrag von dysti »

Also, schau mal hier: http://www.purearea.net/pb/german/index.htm
Dort findest du alles. Schau dir auch das Code-Archiv an, dort findest du auch Hinweise zum Timer.
Dann natürlich auch in der PB-Hilfe unter Database und hier zusätzlich SQLite SQL Befehle.
Habe im Moment meine Glaskugel verloren, so weiß ich nicht, welches Datenbanksystem du verwendest.
Nach dem Auslesen des DB-Feldes kann man direkt den Wert in die neue Tabelle schreiben.

Das Hineinschreiben bzw. Aktualisieren eines DB-Feldes geht so:

Code: Alles auswählen

DatabaseUpdate(#Datenbank2, "UPDATE employee SET checked=1 WHERE id="+GetDatabaseString(#Datenbank, 0))
Eine neue DB-Tabelle wird so erstellt:

Code: Alles auswählen

DatabaseQuery(#DatenBank2, "Create Table MyTable(ID AutoIncrement, DeadRecord Long, RecordName Text(128), Description memo);" )
Fazit: SQL-Befehle lernen.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Mr.Vain
Beiträge: 88
Registriert: 29.10.2009 00:14

Re: SQL Abfrage im Hintergrund

Beitrag von Mr.Vain »

Vielen Dank für eure Hilfe !

Wenn ich die ausgewählten einträge in eine neue (kleinere DB) packe, ist dies dann nachher eine "datenbank-Datei" oder muss ich einen "echten" SQL-Server laufen lassen?
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQL Abfrage im Hintergrund

Beitrag von Kiffi »

Mr.Vain hat geschrieben:Wenn ich die ausgewählten einträge in eine neue (kleinere DB) packe, ist dies dann nachher eine "datenbank-Datei" oder muss ich einen "echten" SQL-Server laufen lassen?
stammt Deine 'große' Datenbank denn aus einem SQL Server? Und warum
trägst Du die Daten überhaupt in eine 'kleine' Datenbank ein? Wie erzeugst
Du die 'kleine' Datenbank?

Grüße ... Kiffi
a²+b²=mc²
Mr.Vain
Beiträge: 88
Registriert: 29.10.2009 00:14

Re: SQL Abfrage im Hintergrund

Beitrag von Mr.Vain »

Kiffi hat geschrieben:
Mr.Vain hat geschrieben:Wenn ich die ausgewählten einträge in eine neue (kleinere DB) packe, ist dies dann nachher eine "datenbank-Datei" oder muss ich einen "echten" SQL-Server laufen lassen?
stammt Deine 'große' Datenbank denn aus einem SQL Server? Und warum
trägst Du die Daten überhaupt in eine 'kleine' Datenbank ein? Wie erzeugst
Du die 'kleine' Datenbank?

Grüße ... Kiffi

Was ich erstellen möchte, ist ein Informations-Programm in dem ich mit einem Suchbegriff Daten aus einer DB auslesen kann.

Die gesuchten Daten befinden sich in einer SEHR großen Tabelle, in der etliche unwichtige Daten enthalten sind. Deswegen möchte ich im Hintergrund (alle 10 Minuten) eine Abfrage dieser großen Tabelle tätigen und die benötigten Daten lokal zwischenspeichern, um die Suche zu beschleunigen.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQL Abfrage im Hintergrund

Beitrag von Kiffi »

Mr.Vain hat geschrieben:Die gesuchten Daten befinden sich in einer SEHR großen Tabelle, in der etliche unwichtige Daten enthalten sind. Deswegen möchte ich im Hintergrund (alle 10 Minuten) eine Abfrage dieser großen Tabelle tätigen und die benötigten Daten lokal zwischenspeichern, um die Suche zu beschleunigen.
ok, verstanden. Ich würde Dir hier eine SQLite - Memory - Datenbank empfehlen -> OpenDatabase(..., ":memory:", ...)
Diese ist 'by Design' sehr schnell und kann ja dann bei Programmende verworfen werden.
Da muss dann nichts gespeichert werden oder so.

Grüße ....Kiffi
a²+b²=mc²
SirMatti74
Beiträge: 37
Registriert: 08.11.2009 09:12

Re: SQL Abfrage im Hintergrund

Beitrag von SirMatti74 »

Irgendwie willst Du also einen Index über Deine Daten per PureBasic erstellen, um im Anschluss schneller suchen zu können. Mal darüber nachgedacht, die Sache direkt in Deiner Datenbank mit einem Index auf dem/den angesprochenen Suchfeld(ern) zu erschlagen. Ein Index halbwegs vernünftig angelegt beschleunigt die Suche bspw. bei einer MySQL-Datenbank enorm. Somit könntest Du Dir das ganze Geraffel mit der Aktualisierung Deines Indexes aller paar Minuten ersparen und es wäre obendrein fachlich sauber (z.B. keine Dopplung bereits vorhandener Daten...).

Grüße
Mr.Vain
Beiträge: 88
Registriert: 29.10.2009 00:14

Re: SQL Abfrage im Hintergrund

Beitrag von Mr.Vain »

Danke für eure Hilfe,

das mit dem Timer funktioniert einwandfrei.

Bin gerade dabei, das Zwischenspeichern in eine DB via SQLite zu realisieren.


Die große vorhandene Tabelle kann ich leider nicht ändern.

Hier mein Lösungs-Ansatz:

Code: Alles auswählen

UseODBCDatabase() 
     DBID = OpenDatabase(#PB_Any, DB$, "", "" ,#PB_Database_ODBC  ) 
                 If DBID > 0 
         
                   
                   
                   CurrDate$ = FormatDate("%yyyy-%mm-%dd %hh-%ii-%ss", Date())
                   
                   Command$ = "select ..........."
                   
      
                     If DatabaseQuery(DBID, Command$)
                        While NextDatabaseRow(DBID)  ; alle Einträge durchlaufen
                                         
                          Line.s = "'"+GetDatabaseString(DBID, 1)+"', '"+GetDatabaseString(DBID, 2)+"', '"+GetDatabaseString(DBID, 3)+"', '"+GetDatabaseString(DBID, 4)+"', '"+GetDatabaseString(DBID, 5)+"'"
                          Debug Line.s
                          
                        Wend
                       FinishDatabaseQuery(DBID)
                                              
                     Else
                      MessageRequester("Fehler", "Fehler bei der Datenbank abfrage!")
                     EndIf
                 Else
                    MessageRequester("Fehler", "Kann die Datenbank nicht öffnen!")
                EndIf
                
             CloseDatabase(DBID)


Mit diesem Code lese ich die gewünschten Daten aus.

Soll ich nun nach dem

Code: Alles auswählen

Debug Line.s
die Daten pro Zeile direkt in eine SQLite DB schreiben oder ist es sinnvoll erst alle Daten zwischenzuspeichern (Linked List) und später alles einzeln in eine neue DB zu schreiben?


2. Frage:

Ich hatte es so gedacht, dass ich dieses Programm im Hintergrund laufen lasse, wobei ich hier kein DB-Update machen kann, sondern jedes mal die Tabellle neu schreiben muss.
Das Benutzer-Programm (mit einer Such-Maske) soll im Vordergrund sein und bei einer Suche auf die neue DB zugreifen.

Kann es hier nicht zu Problemen führen, wenn ich eine Suche Durchführe und das 2. Programm die DB neu schreiben will ?
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: SQL Abfrage im Hintergrund

Beitrag von dysti »

zwischenzuspeichern (Linked List) und später alles einzeln in eine neue DB zu schreiben?
Ich würde sofort alles direkt speichern
Kann es hier nicht zu Problemen führen, wenn ich eine Suche Durchführe und das 2. Programm die DB neu schreiben will ?
Es kommt zu keinem Problem sofern du PostgreSQL, SQLite bzw. Mysql verwendest.
Ich kenne die Größe des Projektes nicht.
Würde dir erstmal zu PostgreSQL raten, da es auch fest in PB integriert ist.
Es gibt verschiedene Zugriffsarten in PostgreSQL, wie shared oder lock.
Einfach mal in der PB-Hilfe schauen.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Mr.Vain
Beiträge: 88
Registriert: 29.10.2009 00:14

Re: SQL Abfrage im Hintergrund

Beitrag von Mr.Vain »

danke.


gibt es in PB ein Befehl, um den Stand bzw. die Erstellung einer DB zu ermitteln (Datum) ?

wie mache ich das, dass der Cursor immer in einem Gadget bleibt?
Antworten