Delphi数据库组件的奇怪行为

时间:2013-01-15 12:16:13

标签: database delphi dbexpress

我的Delphi数据库组件有问题。我试图为程序添加一些功能,但是遇到了奇怪的问题。我将其分解为一个简单的示例项目,行为仍然存在。

我在Delphi 2007上创建了一个新的Forms应用程序,添加了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是一旦执行了Button1Click的Refresh,就立即执行0。但是条目是并保留在数据库中。

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

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

也许这一个:

“问题:
将MSSQL dbExpress驱动程序与ClientDataSet和Provider一起使用时,在调用ApplyUpdate时不断收到以下错误:无法创建新连接,因为在手动或分布式事务模式下

建议的工作:
将“poFetchDetailsOnDemand”(对于Provider)设置为False。当它设置为True时,这是一个已知问题。“

(引自this Embarcadero article引用SQLOLEDB Allows Only One Connection in Scope of Transaction

“无法创建新连接,因为在手动或分布式事务模式下”有一小部分搜索结果