SQLite3 unter PB

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

Danke dir Kiffi.
Nachdem ich jetzt ne halbe std gesucht habe warum ich keine Daten aus der DB bekomme und schon dachte es is beim Konvertieren was schief gegangen habe ich es nun hin bekommen.
Ich war so schlau und habe die Variable, in der ich das Handle der geöffneten DB gespeichert habe, nicht Global Declariert.
Doch nun gehts und die ersten stichproben sehen gut aus und es scheint so als ob die DB sauber von der SQL zu der DB für SQLite3 Konvertiert wurde.

Genaueres kann ich erst sagen wenn ich die komplette auswertung für die DB fertighabe, doch wird das noch paar tage dauern da die DB aus allein 15 Tabellen besteht und die Daten jeder Tabelle mit denen einer der anderen verknüft sind.

Aber noch mal nen super dank an dich Kiffi für deine Hilfe!!! :allright:

Gruß,
Nico
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

Sehr hilfreich bei der Arbeit mit SQLite3 ist der "SQLite Database Browser"
http://sourceforge.net/project/showfile ... e_id=91778

Es ist immer gut zu sehen, was man nun wirklich in die Datenbank geschrieben hat bzw. zu testen, was ein SQL-Befehl bewirkt. :wink:
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Sehr hilfreich bei der Arbeit mit SQLite3 ist der "SQLite Database
> Browser"

ja, das Programm ist ganz nett. Ebenfalls empfehlenswert ist das SQLite
Control Center: http://home.student.uu.se/frax0795/

Bei Interesse kann ich auch mal den Code eines simplen Datenbankbrowsers
in PB posten.

Grüße ... Kiffi
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

@ Kiffi
Bei Interesse kann ich auch mal den Code eines simplen Datenbankbrowsers
in PB posten.
Da wäre ich sehr interesiert drann!

Gruß,
Nico
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Da wäre ich sehr interesiert drann!

Hier der Code für den SQLiteViewer. Ist recht simpel gehalten.

Zu beachten:

* Umlaute werden nicht richtig dargestellt, weil PB kein Unicode
unterstützt.

* Stringfeldinhalte größer 64 kB bringen das Programm zum Absturz. Ich
überlege momentan noch, ob ich dafür einen Fix bringe oder aber auf die
PB V4.0 warte ;-)

Grüße ... Kiffi

Code: Alles auswählen

Enumeration
  #frmMain
  #lstTables
  #lvwData 
  #mnuMenue
  #mnuFileOpen
EndEnumeration

Global DatabaseFile$
Global DatabaseHandle.l

Declare RefillDataView()
Declare AddListIconGadget(ColName$)
Declare ReOpenDatabase()
Declare RefillTableList()

If SQLite3_InitLib("sqlite3.dll") = #False
  MessageRequester("SQLiteViewer", "Couldn't initialize SQLite3.DLL")
  End
EndIf

File$ = ProgramParameter()
If File$
  If FileSize(File$) > 0
    DatabaseFile$ = File$
  EndIf
EndIf

If DatabaseFile$ = ""
  DatabaseFile$ = "D:\testdaten\temp.db"
EndIf

If OpenWindow(#frmMain, 0, 0, 700, 500, #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "SQLiteViewer") 
  
  If CreateGadgetList(WindowID(#frmMain)) 
    
    ListViewGadget(#lstTables,1,0,100, WindowHeight()) 
    
    AddListIconGadget("")
    
    If CreateMenu(#mnuMenue, WindowID(#frmMain))
      MenuTitle("File")
      MenuItem(#mnuFileOpen,"Open...")
    EndIf
    
    If ReOpenDatabase() : RefillTableList() : EndIf

    Repeat
      
      WaitWindowEvent = WaitWindowEvent()
      EventGadgetID   = EventGadgetID()
      EventMenuID     = EventMenuID()
      
      Select WaitWindowEvent
        
        Case #PB_Event_Gadget 
          
          Select EventGadgetID
            
            Case #lstTables
              RefillDataView()
              
          EndSelect 
          
        Case #PB_Event_Menu
          
          Select EventMenuID
            
            Case #mnuFileOpen
              
              File$ = OpenFileRequester("Choose Database",DatabaseFile$,"*.*",0)
              
              If File$
                DatabaseFile$ = File$
                If ReOpenDatabase() : RefillTableList() : EndIf
              EndIf
              
          EndSelect 
          
        Case #PB_Event_CloseWindow
          Quit = 1
          
      EndSelect
      
    Until Quit = 1 
    
    SQLite3_End()
    
  EndIf
  
EndIf 

Procedure.s GetSchema(Tablename$, lDataBaseHandle.l)   ; Returns a schema of a table
  
  DefType.SQLite3_Recordset myRS
  
  If lDataBaseHandle = 0
    LastMessage$ = "Wrong Database-Handle"
    ProcedureReturn ""
  EndIf
  
  If Tablename$ = ""
    LastMessage$ = "Tablename is empty"
    ProcedureReturn ""
  EndIf
  
  SQL$ + "SELECT sql FROM "
  SQL$ + "(SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) "
  SQL$ + "WHERE tbl_name = '" + Tablename$ + "' AND type!='meta' "
  SQL$ + "ORDER BY type DESC, name "
  
  Schema$ = ""
  
  If SQLite3_GetRecordset(SQL$, lDataBaseHandle, @myRS )
    If myRS\Handle 
      If SQLite3_GetRecordsetValueByIndex(0, @myRS)
        Schema$ + myRS\sValue 
      EndIf
    EndIf
  EndIf
  
  SQLite3_ReleaseRecordset(@myRS)
  
  ProcedureReturn Schema$
  
EndProcedure

Procedure.s GetFieldNames(Tablename$, lDataBaseHandle.l) ; Returns the fieldnames of a table
  
  DefType.SQLite3_Recordset myRS
  
  If lDataBaseHandle = 0
    LastMessage$ = "Wrong Database-Handle"
    ProcedureReturn ""
  EndIf
  
  If Tablename$ = ""
    LastMessage$ = "Tablename is empty"
    ProcedureReturn ""
  EndIf
  
  Schema$ = GetSchema(Tablename$, lDataBaseHandle)
  
  lP1 = FindString(Schema$, "(",1)
  If lP1
    lP1 + 1
    lP2 = FindString(Schema$, ")",lP1)
    If lP2 
      Dummy1$ = Mid(Schema$, lP1, lP2-lP1)
      lP1 = CountString(Dummy1$, ",")+1
      For intI = 1 To lP1
        Dummy2$ = Trim(StringField(Dummy1$,intI, ","))
        If FindString(Dummy2$," ",1)
          Fieldnames$ + StringField(Dummy2$,1, " ") 
        Else
          Fieldnames$ + Dummy2$ 
        EndIf
        If intI <> lP1
          Fieldnames$ + ";"
        EndIf
      Next intI
    EndIf
  EndIf  
  
  ProcedureReturn Fieldnames$
  
EndProcedure

Procedure RefillDataView()
  
  DefType.SQLite3_Recordset myRS

  FreeGadget(#lvwData)
  
  ; Erstmal die Feldnamen für die Columnheader ermitteln
  Fieldnames$ = GetFieldNames(GetGadgetItemText(#lstTables, GetGadgetState(#lstTables), 0), DatabaseHandle)
  
  AddListIconGadget(StringField(Fieldnames$,1,";"))
  
  For lCol = 2 To CountString(Fieldnames$, ";") + 1
    AddGadgetColumn(#lvwData, lCol ,StringField(Fieldnames$,lCol,";"),100) 
  Next lCol 
  
  ; Nun die Daten aus der Tabelle auslesen und in das ListIconGadget eintragen
  
  SQL$ = "Select * from " + GetGadgetItemText(#lstTables, GetGadgetState(#lstTables), 0)
  
  SQLite3_GetRecordset(SQL$, DatabaseHandle, @myRS)
  
  While myRS\EOF = #False
    
    Row$ = ""
    
    For lCol = 0 To myRS\Cols - 1
      
      SQLite3_GetRecordsetValueByIndex(lCol, @myRS)
      
      Row$ + myRS\sValue
      
      If lCol <> myRS\Cols
        Row$ + Chr(10)
      EndIf
      
    Next
    
    AddGadgetItem(#lvwData,-1, Row$)
    
    SQLite3_RecordsetMoveNext(@myRS)
    
  Wend
  
  SQLite3_ReleaseRecordset(@myRS)
  
EndProcedure

Procedure AddListIconGadget(ColName$)
  
  UseWindow(#frmMain)
  
  ListIconGadget(#lvwData  ,101 , 0, WindowWidth() - GadgetWidth(#lstTables) - 2, WindowHeight() - 20, ColName$, 100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines) 
  
EndProcedure

Procedure.l ReOpenDatabase()
  
  If DatabaseHandle
    SQLite3_CloseDatabase(DatabaseHandle)
    DatabaseHandle = 0
  EndIf
  
  DatabaseHandle = SQLite3_OpenDatabase(DatabaseFile$)
  
  If DatabaseHandle
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
  
EndProcedure

Procedure RefillTableList()
  
  DefType.SQLite3_Recordset myRS
  
  ClearGadgetItemList(#lstTables)
  
  SQL$ = "Select tbl_name from sqlite_master where type='table' order by tbl_name"
  
  SQLite3_GetRecordset(SQL$, DatabaseHandle, @myRS)
  
  While myRS\EOF = #False
    SQLite3_GetRecordsetValueByIndex(0, @myRS)
    AddGadgetItem(#lstTables,-1, myRS\sValue)
    SQLite3_RecordsetMoveNext(@myRS)
  Wend
  
  SQLite3_ReleaseRecordset(@myRS)
  
EndProcedure
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

@kiffi

Ich habe mal noch ne frage zu SQL.
Und zwar habe ich in einer Tabelle Werte die ungefähr so aussehen "WF19478".
Die ersten beiden Zeichen sind immer Buchstaben (ist ein bestimmter code).

Gibt es nun eine möglichkeit in der Tabelle alle Werte zu finden die z.b. "WF" am anfang haben ohne die restlichen Zahlen zu wissen?

Ich habe das mal mit folgender SQL-Anweisung versucht doch geht das nicht
"SELECT * FROM arpt WHERE arpt_ident = 'WF'"
Danke schon mal

Gruß Nico
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Code: Alles auswählen

SELECT * FROM arpt WHERE arpt_ident Like 'WF%'
Grüße ... Kiffi
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

nicolaus hat geschrieben:Gibt es nun eine möglichkeit in der Tabelle alle Werte zu finden die z.b. "WF" am anfang haben ohne die restlichen Zahlen zu wissen?

Ich habe das mal mit folgender SQL-Anweisung versucht doch geht das nicht
"SELECT * FROM arpt WHERE arpt_ident = 'WF'"
Gruß Nico
Probier mal das:

Code: Alles auswählen

SELECT * FROM arpt WHERE arpt_ident LIKE 'WF%';
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

Ich danke euch beiden ganz sehr!
Die Anweisung "Like" kannte ich noch garnich!
Benutzeravatar
Purethom
Beiträge: 50
Registriert: 21.09.2004 05:41
Wohnort: Berlin

Beitrag von Purethom »

Hallo Kiffi,

ich benutze deine SQLite3-Userlib unter PB 3.94. Super in der Handhabung! Langsam möchte ich aber auf PB 4.0 umsteigen. Gibt es eine spezielle Version für 4.0? Wenn nicht, könntest du bitte den Example-Code aus dem Archiv so umschreiben und posten, das er mit 4.0 funktioniert? Irgendwie scheitert der Compiler an der DefType-Zeile.
Sollte ich was übersehen haben, bitte nicht so schlimme Schelte.

Für eventuelle Hilfe danke ich schon jetzt

Grüße von PureThom
Antworten