如何测试Interbase中是否存在表?

时间:2017-06-02 15:26:29

标签: delphi interbase delphi-10.2-tokyo

我刚刚开始使用Interbase,我需要验证数据库是否有表,如果数据库中存在表,如何检查Interbase?

1 个答案:

答案 0 :(得分:4)

对于IBX,至少有这些方式是不可取的:

1。使用SQL查询

您可以通过 RDB$RELATION_NAME 列查询您过滤的RDB$RELATIONS系统表格。例如,当数据库中存在名为 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类用于获取元数据。不幸的是,它不是那么高效且易于使用,只是检查数据库中是否存在某个表,因为它可以获取所有表的列表或表本身的详细信息。所以我没有例子就留下这个选项。