2012-02-24 14 views
2

Delphiの使用すべてのフィールド、制約、外部キー、インデックスを含む特定のテーブル構造(データなし)を含むクラスを作成する必要があります。目標は「標準的な」表を持ち、それを比較して相違点を見つけることです。このことは私の大きなプロジェクトに含めるべきで、私は "外側の"コンパイラを使うことはできません。さらに、この機能は拡張される可能性がありますので、私は自分自身で実現する必要があります。問題は、この情報を取得し、接続文字列を持ち、特定のテーブル名を知る方法です。 SQL Server 2008が使用されています。Delphi:オブジェクトへのテーブル構造の取得方法

+1

[質問](http://stackoverflow.com/questions/181909/tool-for-scripting-tab) le-data)が同じでない場合、誰かが役立つ可能性のあるすべてのテーブル定義、データベース情報などを取得する回答(コメントブロックとすべてのSQLスクリプトを持つ回答)を投稿しました。 –

+0

一般的な方法はありません。したがって、抽象ベースを宣言し、実際のスキーマデータをDBMS固有のストレージから移入する必要があります(例:SQL-92対応DBMSのINFORMATION_SCHEMA) – OnTheFly

+0

TADOConnection.OpenSchemaを使用すると、あなたの情報の大半を得ることができます。他のスキーマ関連の情報はsysテーブルにあります(SQL Serverのバージョンによって異なります)。 – kobik

答えて

3

あなたはDelphiのソースを見れば、それはこのように行われています:

* = 2 1

表から更新選択:

メタデータは、例の制約のために、Information Schema Viewsで取得することができます:

SELECT * FROM databaseName.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
Where TABLE_NAME='tableName' 
+0

これは、制約、外部キー、インデックス、およびその他のメタデータではなく、列名のみを取得します。 –

+0

負の 'where'条件を使用すると、SQL解析と実行中に条件を評価する必要があるため、IOサイクルが浪費します。例えば、ファイアバードサーバは、負の 'where'条件に対して' Execute time = 110ms'を消費します。 'select first 0 * table 'を使うと、実行中に' Execute time = 0ms'を消費します。 –

0

私はデルファイに触れてから非常に長い時間を過ごしましたが、私は以前にやったことをいくつか覚えています。同様に

select top 0 * from table 

は0レコードを返しますが、TQueryにはメタデータが「移入」されます。または、TClientDataSetで行を-1に設定することもできますが、これは同じ効果があります。

私が言ったように、私はDelphiで微妙に変化していて、BDEを使用していてネイティブクライアントではないので、これは役に立たない可能性があります。

これは少しでも役立ちます。

+0

帽子はAntonioと同じですが、hatは制約、外部キー、インデックス、およびその他のメタデータではなく、列名のみを取得します。 –

+0

'select top'構文は、異なるデータベースサーバ間の標準SQLではありません。 Firebirdサーバは 'select first'を使い、MySQLは' limit'キーワードを使うかもしれません。 –

関連する問題