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 つの奇妙な点は、プログラムを終了してもう一度開始し、別のレコードを追加しようとすると、「手動または分散トランザクション モードのため、新しい接続を作成できません」というエラーが表示されることです。テーブルからレコードを削除してプログラムを再起動するとすぐに、もう一度追加できます。
この奇妙な動作がどのように発生し、どのように修正できるか教えてもらえますか?
前もって感謝します。