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 被执行。然而,这些条目是并且保留在数据库中。

另一个奇怪的事情是,一旦我退出程序,然后重新启动并尝试添加另一条记录,我就会收到错误“无法创建新连接,因为在手动或分布式事务模式下”。一旦我从表中删除记录并重新启动程序,我就可以再次添加。

有人可以告诉我这种奇怪的行为是如何发生的以及我该如何解决它?

提前致谢。

4

1 回答 1

0

Maybe this one:

"Problem:
When using the MSSQL dbExpress driver with a ClientDataSet and a Provider, keep getting the following error when calling ApplyUpdate: Cannot create new connection because in manual or distributed transaction mode

Suggested Work Around:
Set "poFetchDetailsOnDemand" (for the Provider) to False. This is a known issue when it is set to True."

(Quoted from this Embarcadero article which refers to SQLOLEDB Allows Only One Connection in Scope of Transaction.

There's a lof of search results for "Cannot create new connection because in manual or distributed transaction mode"

于 2013-01-15T13:28:59.657 回答