2013-05-27 3 views
1

Я хочу знать, есть ли способ вернуть имена баз данных из MySQL с использованием объекта Delphi TSQLConnection, я знаю, что есть некоторые методы, которые возвращают имена таблиц или имена полей: TSQLConnection. getTableNames, TSQLConnection.GetFieldNamesDelphi: возвращает имена баз данных из MySQL с использованием метаданных

, но я не могу найти способ получить базы данных на определенном сервере.

Существует метод OpenSchema в объекте TADOconnection: TADOconnection.Openschema, который может возвращать имена баз данных, но в TSQLConnection метод -защищенный, не публичный, не может возвращать имена баз данных.

P.S. Я не хочу выполнять запрос типа «показать базы данных» или «выбрать» из information_schema.schemata.

любой корпус может помочь, спасибо.

+0

Вы используете соединение MySQL или ODBC? Если вы используете MySQL, вы обычно устанавливаете имя базы данных в параметрах TSQLConnection, так что вы можете просто запросить это так: 'SQLConnection.Params.Values ​​['Database'];' Если это не работает для вас, вам нужно дать больше информации о как настроен ваш TSQLConnection. – Re0sless

+0

Я знаю, что я могу настроить базу данных по параметрам, но как получить все имена баз данных? –

ответ

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;