MySQL DB und Daten allgemein auslesen
Verfasst: 01.02.2009 14:41
				
				Hallo erstmal 
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
			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