我最近刚开始使用Interbase,我需要验证数据库是否有表,如果数据库中有表,我如何检查Interbase?
问问题
3502 次
1 回答
4
对于 IBX,至少有以下几种方式:
1.使用SQL查询
您可以查询您在其中按列过滤的RDB$RELATIONS系统表。RDB$RELATION_NAME
例如,当数据库中存在1
被调用的表时,此查询返回MyTable
:
SELECT 1 FROM RDB$RELATIONS
WHERE RDB$RELATION_NAME = 'MyTable'
在客户端使用 IBX,您可以编写例如:
function TableExists(Database: TIBDatabase; const TableName: string): Boolean;
var
Query: TIBSQL;
begin
Query := TIBSQL.Create(Database);
try
Query.SQL.Text := 'SELECT 1 FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = ?';
Query.Params[0].AsString := TableName;
Query.ExecQuery;
{ RecordCount reports only visited records, so it should be either 0 or 1 now }
Result := Query.RecordCount > 0;
finally
Query.Free;
end;
end;
此版本区分大小写,并且当您需要仅偶尔从代码中确定表是否存在时非常有效(为了经常检查,我将缓存GetTableNames方法返回的所有表名的列表并仅查询此类列表)。
2. 使用 TIBDatabase.GetTableNames 方法
TIBDatabase类能够通过 GetTableNames 方法列出所有表名。在返回的字符串列表集合中,您可以通过IndexOf方法验证名称是否存在。例如:
function TableExists(Database: TIBDatabase; const TableName: string): Boolean;
var
Tables: TStrings;
begin
Tables := TStringList.Create;
try
Database.GetTableNames(Tables, True);
Result := Tables.IndexOf(TableName) <> -1;
finally
Tables.Free;
end;
end;
此版本不区分大小写(只要您不会更改返回集合的CaseSensitive属性的默认值),自然不如单独或偶尔使用的第一种方式高效,因为这种方式从服务器到客户端。但是,如果您缓存返回的集合, GetTableNames方法本身对于频繁使用可能很有用。
3. 使用 TIBExtract 类
TIBExtract IBX 类用于获取元数据。不幸的是,仅仅检查数据库中是否存在某个表并不是那么高效和容易使用,因为它可以获取所有表的列表或表本身的详细信息。所以我没有举例说明这个选项。
于 2017-06-03T18:35:31.393 回答