我刚刚开始使用InterBase,我需要验证数据库是否具有表格,如何在数据库中是否存在表格?
<</p>对于IBX,至少有这些方式可供使用:
1。使用SQL查询
您可以查询 RDB $ RELADENDY 系统表,其中您可以通过 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;
此版本对情况很敏感,当您需要确定表是否仅在code中存在时(对于经常检查表(时,这是有效的只是这样的列表(。
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;
此版本是不敏感的(这么长的时间,您不会更改返回集合的 case敏感属性的默认值(,并且自然不如单次或单次使用的第一种方法那样有效因为这是从服务器到客户端获取整个表名称的收集。但是 getTablEnames 方法本身对于缓存返回的集合时,对于经常使用很有用。
3。使用tibextract类
tibextract IBX类用于获取元数据。不幸的是,仅检查数据库中是否存在某些表,因为它可以获取所有表列表或表本身的详细信息,因此并不是那么有效且易于使用。因此,我在没有示例的情况下离开此选项。