Seite 2 von 3

Re: SQL Abfrage im Hintergrund

Verfasst: 23.02.2010 12:59
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

Re: SQL Abfrage im Hintergrund

Verfasst: 23.02.2010 13:16
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.

Re: SQL Abfrage im Hintergrund

Verfasst: 24.02.2010 10:18
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?

Re: SQL Abfrage im Hintergrund

Verfasst: 24.02.2010 11:36
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

Re: SQL Abfrage im Hintergrund

Verfasst: 24.02.2010 13:06
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.

Re: SQL Abfrage im Hintergrund

Verfasst: 24.02.2010 14:52
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

Re: SQL Abfrage im Hintergrund

Verfasst: 24.02.2010 22:34
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

Re: SQL Abfrage im Hintergrund

Verfasst: 26.02.2010 10:37
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 ?

Re: SQL Abfrage im Hintergrund

Verfasst: 27.02.2010 18:48
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.

Re: SQL Abfrage im Hintergrund

Verfasst: 01.03.2010 15:42
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?