0

Delphi データベース コンポーネントに問題があります。プログラムにいくつかの機能を追加しようとしましたが、奇妙な問題が発生していました。私はそれを単純なサンプル プロジェクトに分解しましたが、動作はまだそこにあります。

Delphi 2007 で新しいフォーム アプリケーションを作成し、TSQLConnection、TSQLTable、TDataSetProvider、および TClientDataSet を追加しました。ローカルの MS SQL データベースの情報と、内部にある単純なテスト テーブルであるテーブルを挿入しました。

CREATE TABLE dbo.Test1(
[Name] varchar(32) not null primary key,
[Type] varchar(16) not null,
[Selected] BIT not null)

次に、TEdit、TListBox、および 2 つのボタンを追加しました。機能は次のとおりです。 Add を押すと、Edit1 という名前のレコードがデータベースに入力されます。[更新] を押すと、リストビューはデータベースに既に存在するエントリでいっぱいになります。

コード:

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  ClientDataSet1.Refresh;
  ClientDataSet1.First;
  while not ClientDataSet1.Eof do
  begin
    ListBox1.AddItem(ClientDataSet1Name.AsString,nil);
    ClientDataSet1.Next;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientDataSet1.Append;
  ClientDataSet1Name.AsString := Edit1.Text;
  ClientDataSet1Type.AsString := 'A1';
  ClientDataSet1Selected.AsBoolean := false;
  ClientDataSet1.Post;
  ClientDataSet1.ApplyUpdates(-1);
end;

今私にとって奇妙なことは、プログラムを開始するときに2つのレコードを追加し(実際にそこにあることを管理スタジオで確認しました)、更新をクリックすると、ClientDataSetのRecordCountがすぐに0になるため、リストは空のままですButton1Click の開始時に Refresh が実行されるためです。ただし、エントリはデータベースに残ります。

もう 1 つの奇妙な点は、プログラムを終了してもう一度開始し、別のレコードを追加しようとすると、「手動または分散トランザクション モードのため、新しい接続を作成できません」というエラーが表示されることです。テーブルからレコードを削除してプログラムを再起動するとすぐに、もう一度追加できます。

この奇妙な動作がどのように発生し、どのように修正できるか教えてもらえますか?

前もって感謝します。

4

1 に答える 1

0

多分これ:

「問題:
MSSQL dbExpress ドライバーを ClientDataSet およびプロバイダーと共に使用すると、ApplyUpdate を呼び出すときに次のエラーが発生し続けます: 手動または分散トランザクション モードであるため、新しい接続を作成できません。

推奨される回避策:
"poFetchDetailsOnDemand" (プロバイダー用) を False に設定します。これは、True に設定されている場合の既知の問題です。」

( SQLOLEDB は、トランザクションのスコープ内で 1 つの接続のみを許可する を参照するこの Embarcadero の記事から引用。

「手動または分散トランザクション モードのため、新しい接続を作成できません」という検索結果が多数あります。

于 2013-01-15T13:28:59.657 に答える