Delphi:使用元数据从 MySQL 返回数据库名称
Posted
技术标签:
【中文标题】Delphi:使用元数据从 MySQL 返回数据库名称【英文标题】:Delphi: Return database names from MySQL using Metadata 【发布时间】:2013-05-22 01:58:45 【问题描述】:我想知道是否有一种方法可以使用 Delphi 对象 TSQLConnection 从 mysql 返回数据库名称,我知道有一些方法可以返回表名或字段名: TSQLConnection.getTableNames、TSQLConnection.GetFieldNames
但我找不到在特定服务器上获取数据库的方法。
TADOconnection 对象中有一个名为 OpenSchema 的方法:TADOconnection.Openschema,它可以返回数据库名称,但在 TSQLConnection 中,方法-protected not public-不能返回数据库名称。
附:我不想执行诸如“显示数据库”或“从 information_schema.schemata 中选择 *”之类的查询。
任何机构都可以提供帮助,谢谢。
【问题讨论】:
您使用的是 MySQL 连接还是 ODBC?如果您使用 MySQL,您通常会在 TSQLConnection 的参数中设置数据库名称,因此您可以像这样查询SQLConnection.Params.Values['Database'];
如果这对您不起作用,您需要提供有关如何设置 TSQLConnection 的更多信息。
我知道我可以在参数上设置数据库,但是如何获取所有数据库名称?
【参考方案1】:
我试过这段代码,它工作,不确定它是否适用于所有 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;
【讨论】:
【参考方案2】:使用查询组件,您可以获得具有以下查询的数据库列表:
SHOW DATABASES;
我一直在寻找这个答案很长时间。希望它会帮助其他人。
【讨论】:
以上是关于Delphi:使用元数据从 MySQL 返回数据库名称的主要内容,如果未能解决你的问题,请参考以下文章