MySQL DB und Daten allgemein auslesen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

MySQL DB und Daten allgemein auslesen

Beitrag von Bisonte »

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

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
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Ronny S.
Beiträge: 73
Registriert: 24.11.2008 16:08

Beitrag von Ronny S. »

Du willst doch nur eine MySQL Datenbank einlesen/auslesen ?
Dann würde ich diesen ganzen Klatteradatsch wieder löschen und nochmal von vorne anfangen.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: MySQL DB und Daten allgemein auslesen

Beitrag von Kiffi »

Bisonte hat geschrieben:Wie kann ich rausbekommen welche Tables überhaupt in einer DB
vorhanden sind ?
Die PBOSL_ExDatabase-Lib (liegt auch als Source vor)
hat eine Funktion ExamineTables(), die Du hierfür verwenden kannst.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

neinnein es geht um diverse Datenbanken gleichzeitig !

Also in diesem speziellen Fall hab ich 3 DB's die ich gleichzeitig bearbeiten müsste.

Aus DB1 werden Daten gebraucht die in DB2 und 3 eingetragen werden sollen usw...

Aber Anwendungsgebiete sind derer doch vielfältig oder nicht ?

Und ich wollte es so hinbekommen, dass

1. Ein Include für eine beliebige DB existiert und nicht ein Include dass ich der DB anpassen muss.

2. Da man vorher nicht weiss, was in der DB für Daten sind, diese vorher ermitteln.
z.B. Tables, Namen derer, Fields usw.

somit wäre es dann möglich nur noch eine Prozedure mit SELECT z.B. aufzurufen und es ist dann egal welche DB diese Prozedur bekommt...

Es sollten die Daten dann korrekt ausgelesen werden.

Vielleicht kann ich das nicht richtig beschreiben, aber ich hoffe mein Anliegen kann man durchschauen.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Ronny S.
Beiträge: 73
Registriert: 24.11.2008 16:08

Beitrag von Ronny S. »

Müssen es denn mehrere Datenbanken sein, kann man das nicht in verschiedenen Tabellen unterbringen.
Ich nehme gerne die bekannte "libmysql" für den Zugriff auf DB.
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

ich kann an der DB aufteilung nichts ändern.

libmysql ... damit komm ich nicht klar. Habe mit der dll zwischendurch unerklärliche abstürze (IMA) die mir nicht erklärbar sind. (mal gehts mal gehts nicht...)

@Kiffi: Damit klappts wunderbar... hatte nur früher die Verbindung zu einer Internet DB nie hinbekommen, daher hab ich die nicht mehr angeschaut...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Gibt es auch eine Möglichkeit sich mit einem Datenbankhost zu verbinden und auszulesen, welche Datenbanken (Namen) auf dem existieren, wie
es zum beispiel der MySQL Connector macht ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Ronny S.
Beiträge: 73
Registriert: 24.11.2008 16:08

Beitrag von Ronny S. »

Du meinst solche Funktion wie : "SHOW DATABASES" das wird nicht so einfach werden.
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Ich glaube was bei XAMPP gefunden zu haben.

die DB information_schema scheint die DBNamen zu beinhalten.

Jetzt frage ich mal so dreist... ist diese DB immer vorhanden ?
Egal welcher Server die DB's hostet ... oder ist das nur bei XAMPP so ?

Weil wenn dem immer so ist, kann ich die DBNamen ja per SELECT aus der
information_schema auslesen...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten