2

FirebirdEmbeddedを実行しているFirebirdデータベースに接続されたDBExpress接続があります。これまでのところすべてが正常に機能していますが、非常に奇妙なことが起こっています。

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、データベースを検査すると、新しいテーブルがありません。

何がそれを引き起こす可能性があるのか​​、そしてどうすればそれを修正できるのか誰もが知っていますか?

4

2 に答える 2

4
  1. これは純粋なトランザクションの問題のように見えます。ここSQLで、、は1つの(または多くの)トランザクションで実行されていますSQL2SQL3そして、トランザクションは少なくとも後もアクティブなままですSQL。そしてNew_TableDataset、別のトランザクションで動作しています。もちろん、最初のトランザクションのコミットされていない変更は表示されません。
  2. この問題は、DataSnap / dbExpressに固有のものではなく、ドライバーの実装に固有のものです。だから、ドライバーが何であるかを知っておくのは良いことです。オプションで、ドライバーベンダーのテクニカルサポートに連絡することもできます。
  3. 何をすべきか(純粋な憶測):
    • コマンドの実行を明示的なトランザクション制御に囲むようにしてください。これにより、必要な手順の後にトランザクションが終了することが保証されます(可能性があります)。
    • および/またはのCOMMIT後に実行してみてください。SQLSQL2
    • TSQLQueryの代わりに使用してみてくださいExecuteDirect。うまくいけば、すべてのコマンドが1つのトランザクションで実行されます。

PS:最後に、別のdbExpressドライバーまたはデータアクセスライブラリを使用することを検討してください。

于 2011-11-14T07:04:40.780 に答える
0

私はADOで同様の問題を抱えていましたが、解決策は次のとおりです。

1 /まだ述べたように:すべてのDDLSQLの後にCOMMITを実行します。

2 /最初のCREATEがOKになったら、作成したテーブルでSELECTクエリ(+ COMMIT)を作成します

于 2011-11-14T10:22:13.047 に答える