
Folgende Problemstellung :
Eine MySQL Datenbank soll eingelesen werden (in LinkLists).
Wie sollte(muss) eine allgemeine Einleseroutine aussehen, damit man nicht
für jedes Table und DB eine neue Routine schreiben muss... ?
Also wie ich die Tables und deren Spaltennamen auslese ist kein Problem.
Aber 1. : Wie kann ich rausbekommen welche Tables überhaupt in einer DB
vorhanden sind ?
2. : Wie ordne ich die Daten die ich erhalte am sinnvollsten ?
Ich hab es probiert mit Table auslesen, jedes Feld den Namen und dann prüfen was das für ein Datentyp ist.
Funktioniert soweit ganz gut, nur hab ich jetzt eine enorm grosse LL womit ich im Moment nicht wirklich was anzufangen weiss...
Das ganze soll schlussendlich dann eine Include Datei werden...
Im Moment hab ich alles wieder verworfen, weil ich absolut auf dem Schlauch stehe ...
Also fing ich neu an und bin im Moment soweit, dass ich mehrere DB's verwalten kann :
P.S.: Die Prozeduren AddDSN und RemoveDSN kommen von mk-soft
Code: Alles auswählen
;#####
;#####
;##### MySQL Include
;#####
;#####
EnableExplicit
If UseODBCDatabase()=0
MessageRequester("Fehler","Die Datenbankfunktionen konnten nicht initialisiert werden.",#MB_ICONWARNING)
End
EndIf
Enumeration 1
#ODBC_ADD_DSN ; // Add data source
#ODBC_CONFIG_DSN ; // Configure (edit) Data source
#ODBC_REMOVE_DSN ; // Remove data source
#ODBC_ADD_SYS_DSN ; // add a system DSN
#ODBC_CONFIG_SYS_DSN ; // Configure a system DSN
#ODBC_REMOVE_SYS_DSN ; // remove a system DSN
#ODBC_REMOVE_DEFAULT_DSN ; // remove the default DSN
EndEnumeration
Procedure.s SQL_AddDSN(databasename.s, user.s, pass.s, server.s="localhost") ; Result String = DSN
Protected name.s, strDriver.s, strAttributes.s
Protected L.l, result.l
Protected *buffer.Character
Protected driver.s = "MYSQL"
; Databasename erzeugen (DSN)
name.s = GetFilePart(databasename)
name = Left(name.s, Len(name.s) - 4)
name = "Pure" + UCase(name)
; Bei fehlenden driver automatisch wählen
If driver = ""
driver = GetExtensionPart(databasename)
EndIf
; Datenbanktreiber auswählen
Select UCase(driver)
Case "MYSQL"
name = "Pure" + UCase(databasename)
strDriver.s = "MySQL ODBC 3.51 Driver"
; Attributes zustellen
strAttributes.s = "Server=" + server
strAttributes.s + ";Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DATABASE=" + databasename
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Case "ACCESS", "MDB"
strDriver.s = "Microsoft Access Driver (*.mdb)"
; Attributes zustellen
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DBQ=" + databasename
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Case "EXCEL", "XLS"
strDriver.s = "Microsoft Excel Driver (*.xls)"
; Attributes zustellen
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DBQ=" + databasename
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Case "DBASE", "DBF"
strDriver.s = "Microsoft dBase Driver (*.dbf)"
; Attributes zustellen
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DBQ=" + GetPathPart(databasename)
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Case "TEXT", "TXT", "CSV"
strDriver.s = "Microsoft Text Driver (*.txt; *.csv)"
; Attributes zustellen
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DBQ=" + GetPathPart(databasename)
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
Default
strDriver.s = driver
EndSelect
*buffer = @strAttributes
For L = 0 To Len(strAttributes) - 1
If *buffer\c = ';'
*buffer\c = 0
EndIf
*buffer + 1
Next L ; Check the next byte
result = SQLConfigDataSource_(0, #ODBC_ADD_DSN, strDriver, @strAttributes) ; Call the function you need from the ODBC library with the right details
If result
ProcedureReturn name
Else
ProcedureReturn ""
EndIf
EndProcedure
Procedure.l SQL_RemoveDSN(databasename.s, user.s, pass.s) ; Remove DSN
Protected name.s, strDriver.s, strAttributes.s
Protected L.l, result.l
Protected *buffer.Character
Protected driver.s = "MYSQL"
; Databasename erzeugen
name = GetFilePart(databasename)
name = Left(name, Len(name) - 4)
name = "Pure" + UCase(name)
; Bei fehlenden driver automatisch wählen
If driver = ""
driver = GetExtensionPart(databasename)
EndIf
; Datenbanktreiber auswählen
Select UCase(driver)
Case "MYSQL"
name = "Pure" + UCase(databasename)
strDriver.s = "MySQL ODBC 3.51 Driver"
Case "ACCESS", "MDB"
strDriver = "Microsoft Access Driver (*.mdb)"
Case "EXCEL", "XLS"
strDriver = "Microsoft Excel Driver (*.xls)"
Case "DBASE", "DBF"
strDriver = "Microsoft dBase Driver (*.dbf)"
Case "TEXT", "TXT", "CSV"
strDriver = "Microsoft Text Driver (*.txt; *.csv)"
Default
strDriver = driver
EndSelect
; Attributes zustellen
strAttributes = "DSN=" + name + ";"
*buffer = @strAttributes
For L = 0 To Len(strAttributes) - 1
If *buffer\c = ';'
*buffer\c = 0
EndIf
*buffer + 1
Next L
result = SQLConfigDataSource_(0, #ODBC_REMOVE_DSN, strDriver, @strAttributes) ; Call the function you need from the ODBC library with the right details
ProcedureReturn result
EndProcedure
Structure mysqldatenbanken
id.i
name.s
dsn.s
user.s
pass.s
server.s
Open.i
EndStructure
Global NewList SQL_DB.mysqldatenbanken()
Procedure SQL_Error()
Protected Err.s
Err = DatabaseError()
If Err <> ""
Err = RemoveString(Err,"[MySQL][ODBC 3.51 Driver]")
Debug Err
EndIf
EndProcedure
Procedure SQL_SelectDB(Name.s)
Protected Result.i = #False
If ListSize(SQL_DB())
ForEach SQL_DB()
If SQL_DB()\Name = Name
Result = #True
ProcedureReturn Result
EndIf
Next
EndIf
ProcedureReturn Result
EndProcedure
Procedure SQL_DelDB(Name.s)
Protected Result
If SQL_SelectDB(Name) = #True
If SQL_DB()\Open
CloseDatabase(SQL_DB()\Open)
EndIf
Result = SQL_RemoveDSN(Name,SQL_DB()\User,SQL_DB()\Pass)
Debug Result
If Result
DeleteElement(SQL_DB(),1)
EndIf
Else
Debug "DB nicht in der Liste"
EndIf
EndProcedure
Procedure SQL_AddDB(Name.s,User.s,Pass.s,Server.s="127.0.0.1")
Protected DB
If SQL_SelectDB(Name) = #True
Debug "DB ist schon eingebunden"
Else
AddElement(SQL_DB())
With SQL_DB()
\Name = Name
\User = User
\Pass = Pass
\Server = Server
\DSN = SQL_AddDSN(\Name,\User,\Pass,\Server)
DB = OpenDatabase(#PB_Any,\DSN,\User,\Pass)
If DB
Debug "Ok"
CloseDatabase(DB)
Else
Debug "DB konnte nicht geöffnet werden"
SQL_Error()
EndIf
EndWith
EndIf
EndProcedure
Procedure SQL_Ende()
Protected Name.s
If ListSize(SQL_DB()) >0
ForEach SQL_DB()
Name = SQL_DB()\Name
Next
SQL_DelDB(Name)
Delay(1)
SQL_Ende()
EndIf
EndProcedure