如何测试 table 是否存在于 Interbase 中?
How do I test if a table exists in Interbase?
我最近才开始使用Interbase,我需要验证数据库是否有table,如果数据库中存在table,我该如何检查Interbase?
对于 IBX 来说,至少有这些方法是不负责任的:
1。使用 SQL 查询
您可以查询 RDB$RELATIONS 系统 table,其中您按 RDB$RELATION_NAME
列进行筛选。例如这个查询 returns 1
when table called MyTable
exists in the database :
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;
此版本区分大小写,当您需要偶尔从代码中确定 table 是否存在时非常有效(为了经常检查,我会缓存 table 返回的所有 table 名称的列表=17=] 方法和查询就是这样的列表)。
2。使用 TIBDatabase.GetTableNames 方法
TIBDatabase class 能够通过 [=17= 列出所有 table 名称] 方法。在返回的字符串列表集合中,您可以通过 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 属性 的默认值返回的集合)自然不如第一种方式高效,因为这种方式从服务器到客户端获取整个 table 名称集合。但是如果缓存返回的集合,GetTableNames 方法本身对于频繁使用很有用。
3。使用 TIBExtract class
TIBExtract IBX class 用于获取元数据。不幸的是,仅检查数据库中是否存在某些 table 并不是那么高效且易于使用,因为它可以获取所有 table 的列表,或 table 本身的详细信息。所以我没有举例说明这个选项。
我最近才开始使用Interbase,我需要验证数据库是否有table,如果数据库中存在table,我该如何检查Interbase?
对于 IBX 来说,至少有这些方法是不负责任的:
1。使用 SQL 查询
您可以查询 RDB$RELATIONS 系统 table,其中您按 RDB$RELATION_NAME
列进行筛选。例如这个查询 returns 1
when table called MyTable
exists in the database :
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;
此版本区分大小写,当您需要偶尔从代码中确定 table 是否存在时非常有效(为了经常检查,我会缓存 table 返回的所有 table 名称的列表=17=] 方法和查询就是这样的列表)。
2。使用 TIBDatabase.GetTableNames 方法
TIBDatabase class 能够通过 [=17= 列出所有 table 名称] 方法。在返回的字符串列表集合中,您可以通过 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 属性 的默认值返回的集合)自然不如第一种方式高效,因为这种方式从服务器到客户端获取整个 table 名称集合。但是如果缓存返回的集合,GetTableNames 方法本身对于频繁使用很有用。
3。使用 TIBExtract class
TIBExtract IBX class 用于获取元数据。不幸的是,仅检查数据库中是否存在某些 table 并不是那么高效且易于使用,因为它可以获取所有 table 的列表,或 table 本身的详细信息。所以我没有举例说明这个选项。