2013-05-27 37 views
1

我想知道是否有方法使用Delphi對象TSQLConnection從MySQL返回數據庫名稱,我知道有一些方法返回表名稱或字段名稱: TSQLConnection。 getTableNames,TSQLConnection.GetFieldNames德爾福:使用元數據從MySQL返回數據庫名稱

但我找不到在特定服務器上獲取數據庫的方法。

在TADOconnection對象中有一個名爲OpenSchema的方法:TADOconnection.Openschema,它可以返回數據庫名稱,但是在TSQLConnection中,受保護的方法not public-不能返回數據庫名稱。

P.S.我不想執行像'show databases'或'select * from information_schema.schemata'這樣的查詢。

任何機構都可以幫忙,謝謝。

+0

您使用的是MySQL連接還是ODBC?如果你使用MySQL,你通常在TSQLConnection的params中設置數據庫名稱,所以你可以像這樣查詢'SQLConnection.Params.Values ['Database'];如果這不適合你,你需要提供更多信息你的TSQLConnection是如何設置的。 – Re0sless

+0

我知道我可以在params上設置數據庫,但是如何獲取所有數據庫名稱? –

回答

2

我想這個代碼和它的工作,不知道它是否會爲所有的MySQL,MariaDB的版本和所有版本的Delphi工作,但對我來說workes,我用delphi 6和MySQL 4.0.25:

function GetMySQLDatabaseNames(AUserName, APassword, AHostName, APort: string; var 
AErrorMessage: String): TStrings; 
var SQLConnection: TSQLConnection; 
    ObjectCursor: ISQLCursor; 
    Status: SQLResult; 
    Counter: Integer; 
    Precision: Smallint; 
    Value: Pointer; 
    IsBlank: LongBool; 
begin 
    Result:= TStringList.Create; 
    SQLConnection:= TSQLConnection.Create(nil); 

    with SQLConnection do 
    begin 
    ConnectionName:='dbnames'; 
    DriverName := 'mysql'; 
    Params.Clear; 
    Params.Values['User_Name'] := AUserName; 
    Params.Values['Password'] := APassword; 
    Params.Values['HostName'] := AHostName; 
    Params.Values['Database'] := 'mysql'; 
    Params.Values['Port'] := APort; 
    LibraryName :='dbexpmda.dll'; 
    VendorLib := 'not used'; 
    GetDriverFunc :='getSQLDriverMySQLDirect'; 
    LoginPrompt :=False; 
    try 
     Connected := True; 

     Status:= MetaData.getObjectList(eObjTypeDatabase, ObjectCursor); 
     while Status = SQL_SUCCESS do 
     begin 
     Status:= ObjectCursor.getColumnPrecision(4, Precision); 
     if Status = SQL_SUCCESS then 
     begin 
      Value:= AllocMem(Precision); 
      Status:= ObjectCursor.getString(4, Value, IsBlank); 
      if Status = SQL_SUCCESS then 
      if not IsBlank then 
       Result.Add(PChar(Value)); 
     end; 
     Status:= ObjectCursor.Next; 
     end; 
     Connected := False; 
     Free; 
    except 
     on E: Exception do 
     begin 
     AErrorMessage:= AErrorMessage + E.Message+ sLineBreak; 
     end; 
    end; 
    end; 
end;