> 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