【发布时间】: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