Firebird Embeddedを実行しているFirebirdデータベースに接続されたDBExpress接続があります。これまでのところすべてうまく動作しますが、非常に奇妙なことが起こっています。なぜCREATE TABLEは成功すると思われますが、DBXでは失敗しますか?
私は、接続を含むデータモジュールといくつかの異なる表を表すTSimpleDataset
オブジェクトを持っています。私は新しいテーブルを追加しようとする。しかし、動作しているように見えますが、その後失敗:私は、テーブルを作成しようとすると
procedure Update(module: TdmDatabase);
const
SQL = 'CREATE TABLE NEW_TABLE (blah blah blah)';
SQL2 = 'ALTER TABLE NEW_TABLE ADD CONSTRAINT PK_NEW_TABLE PRIMARY KEY (blah)';
SQL3 = 'DROP TABLE NEW_TABLE';
begin
module.connection.ExecuteDirect(SQL); //succeeds
module.connection.ExecuteDirect(SQL2); //succeeds
try
module.New_TableDataset.Active := true; //fails
except
module.connection.ExecuteDirect(SQL3); //succeeds
raise;
end;
end;
は、動作するように見える、と私はできALTER
とDROP
それだけで罰金、しかしときSELECT
を実行しているデータセットを開こうとすると、「無効なテーブル名」というエラーが表示されます。 CREATE TABLE
ステートメントが実行された直後にデバッガでプログラムを実行してプログラムを終了させた場合、データベースを調べると新しいテーブルは存在しません。
誰でも何が起こる可能性がありますか、どのように修正できますか? SQL
、SQL2
とSQL3
が1つ(または多くで)トランザクションで実行されている純粋なトランザクションの問題、のように見える
作成したテーブルの上にSELECTクエリを作成します(+ COMMIT)、私はFirebirdのためIBXを使用するので、これはコメントです。確認してくださいテーブルの作成に使用したトランザクションをコミットします。 "New_TableDataset"が新しいトランザクションを使用してアクティブ化されていることを確認します。システムテーブルのビューが異なる長期実行トランザクションを使用してアクティブ化されません。 –
その他のヒント:ほとんどのDDL操作を自分のトランザクションに実行し、すべてのトランザクションをコミットします。いくつかのツールでは、「DDL操作を自動コミットする」というオプションがあります。また、DDLと通常の操作を混在させることは絶対にありません。 –
非推奨のTSimpleDatasetの代わりにTSqlQueryコンポーネントを使用することがあります。 –