2017-06-02 16 views
1

私はちょうどInterbaseの使用を開始しました。データベースにテーブルがあるかどうかを確認する必要があります。データベースにテーブルが存在する場合、Interbaseをチェックインするにはどうすればいいですか? IBXの場合Interbaseにテーブルが存在するかどうかをテストするにはどうすればよいですか?

+1

Interbase? Interbaseを使用してもよろしいですか?もしそうなら、このhttp://www.devrace.com/en/fibplus/articles/2325.phpをチェックしてください。 – Victoria

+0

@Victoria –

+0

ありがとうございました!とにかくFireDACを使用している場合は、サポートされているすべてのDBエンジン汎用メソッド[GetTableNames](http://docwiki.embarcadero.com/Libraries/Tokyo/en/FireDAC.Comp.Client.TFDCustomConnection.GetTableNames)に使用できます。あなたが知りたいと思っているテーブル。 – Victoria

答えて

3

これらの方法はdisponible、少なくともあります

1.あなたはRDB$RELATION_NAME列でフィルタリングするRDB$RELATIONSシステムテーブルを照会することができますSQLクエリ

を使用します。

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; 

このバージョンでは、大文字と小文字が区別されます:

SELECT 1 FROM RDB$RELATIONS 
    WHERE RDB$RELATION_NAME = 'MyTable' 

IBXでは、クライアント側で使用すると、インスタンスのためにこれを書くことができます。たとえば、このクエリでは、1表はMyTableがデータベースに存在する呼び出されたときに返しますテーブルがコードからのみ存在するかどうかを判断する必要があるときに効率的です(頻繁にチェックするために、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プロパティのデフォルト値は変更されません)と、自然に、単一またはocassional使用のための第一の方法ほど効率的ではありませんこれは、サーバーからクライアントへのテーブル名コレクション全体をフェッチするためです。しかし、GetTableNamesメソッド自体は、返されたコレクションをキャッシュすると頻繁に使用すると便利です。 TIBExtractクラス

を使用

3. TIBExtract IBXクラスは、メタデータをフェッチすることを意図しています。残念ながら、すべてのテーブルのリストまたはテーブル自体の詳細のいずれかをフェッチできるため、特定のテーブルがデータベースに存在するかどうかをチェックするだけでは効率的で簡単ではありません。だから私はこのオプションを例のままにしておきます。

+1

...「RDB $ PROCEDURES」(http://docwiki.embarcadero.com/InterBase/2017/en/RDB$PROCEDURES) 'RDB $ PROCEDURE_NAME = 'から選択カウント(*)を見つけ出すのを手伝ってくれました。 my_proc'' – Wolf

関連する問題