MySQL - Show Databases, Show Tables

Ein Forum zum Erfahrungsaustausch und Hilfestellung in deutscher Sprache.

MySQL - Show Databases, Show Tables

Postby PMan » Mon Aug 23, 2010 11:39 am

Hallo Miteinander,

ich suche eine Möglichkeit aus kBasic heraus wie in MySQL den Befehl "Show Databases;" abzusetzen, um alle möglichen Datenbanken einer MySQL-Datenbank in einer Combobox als Auswahlmöglichkeit zur Verfügung zu stellen. Hierzu fehlt mir aber ein einfacher Datenbankconnect. Oder würde dies eventuell über einen "Database.TestConnection(...) funktionieren?

Entsprechend suche ich auch eine Möglichkeit nach einem Database.Open die Tabellen mit "Show Tables" auszulesen und für eine Combobox zur Verfügung zu haben.

Kann man sich eigentlich zur gleichen Zeit mit 2 Datenbanken connectieren? Und wie unterscheidet man dann die Datenbanken voneinander - nur über die Tabellen?
PMan
 
Posts: 145
Joined: Sat Jul 03, 2010 12:31 pm
Location: Switzerland

Re: MySQL - Show Databases, Show Tables

Postby berndnoetscher » Wed Aug 25, 2010 10:34 am

Hallo,

Qt unterstützt sowas nicht direkt:
Database.TestConnection geht schon, aber dafür musst du ja die dbnamen schon kennen. für MySQL "Show Databases;" müsste mindestens 1 datenbankconnection geöffnet sein. zum auslesen von MySQL "Show Databases;" fehlt noch die möglichkeit das ergebnis auslesen zu können Query.Run(DataBase As String, QueryNameOrSql As String) As Boolean gibt ja nur boolean zurück.

<<Kann man sich eigentlich zur gleichen Zeit mit 2 Datenbanken connectieren?
Ja, entprechend Datenbankname bei connect und close etc. angeben.

DBNAMEHIER!!!!!

Function Open(Driver As String, DBNAMEHIER!!!!!, User As String, Password As String, Host As String = LocalHost, Options As String = DefaultOptions, Port As String = DefaultPort) As Boolean
berndnoetscher
Site Admin
 
Posts: 1059
Joined: Tue Sep 25, 2007 9:37 am

Re: MySQL - Show Databases, Show Tables

Postby PMan » Thu Aug 26, 2010 10:03 am

Hi Bernd,

das verstehe ich noch nicht. Jedes MySQL-System enthält die Systemdatenbanlen MySQL und information_schema. Damit lässt sich auf jeden Fall ein Datebase.Open absetzen und ein Connect öffnen. Dann gibt es in MySQL den Befehl "Show Databases;". Nachdem mir Henning den Befehl Run(SQL-Befehl) aufgezeigt hat, habe ich auch noch Get(SQL-Befehl) gefunden, der AnyType zurück liefert. Damit sollte MySQL doch alle Datenbanken ausliefern können.
Code: Select all
Private Sub cbDBShowDB_OnEvent()
 
Dim iDS as Integer, iLen as Short
Dim sSQL as String
Dim sValues as Strings = New Strings
Dim sVal as String

  sSQL    = "Show Databases;"
  sVal    = Get(sSQL)
  sValues = Get(sSQL)
  iLen    = sValues.Length
  For iDS = 1 To iLen
    sVal = sValues.String(iDS)
    Print iDS, sVal
  Next iDS
     
End Sub

sVal liefert tatsächlich die erste in MySQL eingetragene Datenbank "information_schema" aus. Leider erzeugt die Zeile iLen = einen RunTime Error: Unknown exception in kbasic runtime, so dass ich die restlichen Datenbanken noch nicht erhalten habe. Warum dieser Fehler entsteht habe ich noch nicht herausgefunden. Vergleiche mit Beispielen in Zusammenhang mit RecordSets zeigen mir jedoch ein ähnliches Vorgehen. Und auch der zweite Code-Versuch liefert in der Zeile For Each ... den Runtime Error
Code: Select all
Private Sub cbDBShowDB_OnEvent()
 
Dim iDS as Integer
Dim sSQL as String
Dim sValues as Strings = New Strings
Dim sVal as String

  sSQL    = "Show Databases;"
  sVal    = Get(sSQL)
  sValues = Get(sSQL)
  For Each sVal in sValues
    iDS = iDS + 1
    Print iDS, sVal
  Next

End Sub
PMan
 
Posts: 145
Joined: Sat Jul 03, 2010 12:31 pm
Location: Switzerland

Re: MySQL - Show Databases, Show Tables

Postby berndnoetscher » Fri Aug 27, 2010 6:39 am

Hallo,
für eine Auflistung aller dbs, muss erst ein neuer Befehl erstellt werden. Schreib's mir auf die todo-list für das nächste release. Anders wird es nicht funktionieren.
berndnoetscher
Site Admin
 
Posts: 1059
Joined: Tue Sep 25, 2007 9:37 am

Re: MySQL - Show Databases, Show Tables

Postby PMan » Wed Sep 01, 2010 1:30 pm

Hi Bernd

bitte den Befehl für Show Tables nicht vergessen. Danke
PMan
 
Posts: 145
Joined: Sat Jul 03, 2010 12:31 pm
Location: Switzerland

Re: MySQL - Show Databases, Show Tables

Postby berndnoetscher » Wed Sep 01, 2010 6:48 pm

PMan wrote:Hi Bernd

bitte den Befehl für Show Tables nicht vergessen. Danke


Wird ein generischer Befehl zum Ausführen beliebiger Datenbankkommandos mit dynamisch Array als returnwert.
berndnoetscher
Site Admin
 
Posts: 1059
Joined: Tue Sep 25, 2007 9:37 am

Re: MySQL - Show Databases, Show Tables

Postby PMan » Mon Jan 03, 2011 2:54 pm

Hallo Miteinander,

nach längerem Suchen habe ich eine Möglichkeit gefunden, Datenbanken und Tabellen aus SQL-Datenbanken auszulesen. Es dürfte sich hierbei um eine ANSI-SQL Abfrage handeln, so dass die Abfrage nicht nur in MySQL sondern auch in anderen SQL-Datenbanken funktionieren sollte. Wesentlich ist, dass man sich vor Aufruf der Routine mit Database.Open auf die Datenbank INFORMATION_SCHEMA sowie auf die eigene Arbeitsdatenbank connectiert. So ist ein Umschalten mit dem Befehl Database.SetCurrentDatabase möglich.
Da diese Datenbank die Informationen in View und nicht in Basic-Tables hält, funktioniert ein Abgriff nicht mit Recotrdsets sondern nur über Queries.
Code: Select all
Public Function ShowDataBases() as Strings
'ermittelt alle Databases in einem Verzeichnis

Dim a as Dictionary
Dim iRec as Integer
Dim sSQL as String, sDB as String
Dim ss as Strings, sDBs as Strings = New Strings

  sSQL = "SELECT schema_name AS 'DataBase' FROM INFORMATION_SCHEMA.SCHEMATA"
  a = Query.Command(sSQL)
  ss = a.Keys()
 
  For iRec = 1 to ss.length()
'    Print ss.String(iRec), a.String(ss.String(iRec))
    sDB = a.String(ss.String(iRec))
    If sDB <> "information_schema" Then
      If sDB <> "mysql" Then
        sDBs.Append(sDB)
      EndIf
    EndIf
  Next iRec
 
  Return sDBs
 
End Function


Code: Select all
Public Function ShowTables(sDB as String, sLookF as String) as Strings
'ermittelt alle Tabellen in einer Datenbank
'sLookF = "*" ==> alle Tabellen ermitteln

Dim a as Dictionary
Dim iRec as Integer
Dim sSQL as String, sTable as String
Dim ss as Strings, sTables as Strings = New Strings

  If Database.SetCurrentDatabase("INFORMATION_SCHEMA") Then
    If sLookF = "*" Then
      sSQL = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES " & _
             "WHERE table_schema = '" & sDB & "';"
    Else
      sSQL = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES " & _
             "WHERE table_schema = '" & sDB & "' " & _
             "AND table_name LIKE '" & sLookF & "';"
    EndIf
    a = Query.Command(sSQL)
    ss = a.Keys()
 
    For iRec = 1 to ss.length()
'      Print ss.String(iRec), a.String(ss.String(iRec))
      sTable = a.String(ss.String(iRec))
      sTables.Append(sTable)
    Next iRec
    Database.SetCurrentDatabase(sDB)
  EndIf
 
  Return sTables
 
End Function

Viel Spaß beim Testen.
Gruß Pman
PMan
 
Posts: 145
Joined: Sat Jul 03, 2010 12:31 pm
Location: Switzerland


Return to Deutsches Forum (in German only)

cron