首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试Interbase中是否存在表?

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

Stack Overflow用户
提问于 2017-06-02 15:26:28
回答 1查看 4.1K关注 0票数 2

我最近才开始使用Interbase,我需要验证数据库是否有一个表,如果数据库中存在一个表,如何签入Interbase?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-03 18:35:31

对于IBX,至少有以下几种方法可供区分:

1.使用SQL查询

可以查询通过RDB$RELATION_NAME列进行筛选的RDB$RELATIONS系统表。例如,当数据库中存在名为MyTable的表时,此查询返回MyTable

代码语言:javascript
复制
SELECT 1 FROM RDB$RELATIONS
  WHERE RDB$RELATION_NAME = 'MyTable'

在客户端使用IBX时,您可以编写以下内容:

代码语言:javascript
复制
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方法验证名称是否存在。例如:

代码语言:javascript
复制
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类用于获取元数据。不幸的是,仅仅检查数据库中是否存在某些表并不那么有效和容易,因为它可以获取所有表的列表或表本身的详细信息。因此,我没有举例说明这个选项。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44332442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档