我对 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 被执行。然而,这些条目是并且保留在数据库中。
另一个奇怪的事情是,一旦我退出程序,然后重新启动并尝试添加另一条记录,我就会收到错误“无法创建新连接,因为在手动或分布式事务模式下”。一旦我从表中删除记录并重新启动程序,我就可以再次添加。
有人可以告诉我这种奇怪的行为是如何发生的以及我该如何解决它?
提前致谢。