1

我想知道是否有一种方法可以使用 Delphi 对象 TSQLConnection 从 MySQL 返回数据库名称,我知道有一些方法可以返回表名或字段名:TSQLConnection.getTableNames、TSQLConnection.GetFieldNames

但我找不到在特定服务器上获取数据库的方法。

在 TADOconnection 对象中有一个名为 OpenSchema 的方法:TADOconnection.Openschema,它可以返回数据库名称,但在 TSQLConnection 中,方法-protected not public-不能返回数据库名称。

PS 我不想执行诸如“显示数据库”或“从 information_schema.schemata 中选择 *”之类的查询。

任何机构都可以提供帮助,谢谢。

4

2 回答 2

2

我尝试了这段代码,它工作了,不确定它是否适用于所有 MySQL、MariaDB 版本和所有 Delphi 版本,但对我来说它有效,我使用的是 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;
于 2013-05-27T11:09:43.410 回答
0

使用查询组件,您可以获得具有以下查询的数据库列表:

SHOW DATABASES;

我一直在寻找这个答案很长时间。希望它会帮助其他人。

于 2021-10-12T08:08:25.377 回答