【问题标题】:Issue with TADODataSet on Delphi 10.1 Berlin. Query hangsDelphi 10.1 Berlin 上的 TADODataSet 问题。查询挂起
【发布时间】:2016-05-29 16:10:32
【问题描述】:

我正在尝试在 Delphi 10.1 Berlin

上的程序中操作 TADODataSet

这是我的代码:

rsGrid.Connection := MyADOConn;
rsGrid.CommandType := cmdText;
rsGrid.CommandText := 'my_StoredProc 100';
rsGrid.IndexName := 'ObjectID';

rsGrid.Active := True; //***** Showstopper here! *****// 

while not rsGrid.Eof do
begin
   Memo1.Lines.Add(rsGrid.FieldByName('ObjectID').AsString);
   rsGrid.Next;
end;

DataSet 的Connection 属性设置如下:

function TMainForm.MyADOConn: TADOConnection;
begin
    Result := TADOConnection.Create(nil);
    with Result do
    begin
        ConnectionString := 'Provider=SQLNCLI11.1;Persist Security Info=False;User ID=user15;Password=mypassword;Initial Catalog=MyDB;Data Source=my.server.com;Initial File Name="";Server SPN=""'';
        KeepConnection := True;
        IsolationLevel := ilCursorStability;
        Mode := cmUnknown;
        LoginPrompt := False;
        Connected := True;
    end;
end;

数据库是 SQL Server 2012,所以我尝试使用 SQL Server Native Client 10 和 11(分别为Provider=SQLNCLI10.1 和 Provider=SQLNCLI11.1)运行它。

我计划稍后将这个 TADODataSet 与一个 Grid 组件一起使用(通过 TDataSet),但我无法让这个东西在 XE8、西雅图和现在的柏林工作。它只是挂在rsGrid.Active := True 上。我也试过rsGrid.Open,但效果不佳。

同时它完美地在我的 XE4 上编译和执行。 我在柏林做错了什么?

【问题讨论】:

  • 很确定它与您的问题无关,但是您创建连接对象的方式正在尖叫内存泄漏。每次调用该函数MyADOConn 时,它都会创建一个新的连接实例,并且您保留的唯一引用是在rsGrid 内部。我希望你稍后在某个地方释放它,但即使这样,设计仍然存在重大缺陷并且仍然可能导致大泄漏。
  • 感谢您提到 Jerry,但这只是一个示例。在我的真实应用程序中,连接对象被正确构造和释放;)由 MadExcept 证明。
  • 如果用 TAdoQuery 替换 TAdoDataSet,能否在 IDE 中使用 Object Inspector 成功打开它?
  • @MartynA,在设计时,我可以在对象检查器中完美地打开 TADODataSet 和 TADOQuery。唯一的问题出现在运行时。
  • 在这种情况下,我认为它可能是只有你可以调试的东西,但你应该能够在运行时轻松找出它挂在哪里。确保您的项目在项目的调试选项下选中了“使用调试 DCU”,然后跟踪到 rsGrid.Active := True。

标签: delphi ado tadodataset delphi-10.1-berlin


【解决方案1】:

这就是发生的事情。我将它作为答案发布,因此它可以帮助将代码从早期版本的 Delphi XE(XE8 之前)移植到 XE8/Seattle/Berlin 的其他人。

由于某种原因,当您移植带有 TADODataSet 组件的表单时,它会丢失一些关键属性。换句话说,组件在传输时会丢失一些在我的特定情况下很重要的属性(即LockType := ltOptimistic)。

如何让它发挥作用
要让您的代码恢复活力,只需重新放置表单上的TADODataSet 组件(删除它并放置一个新组件)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多