2016-05-29 81 views
1

我想在程序上德尔福10.1柏林德尔福10.1德国柏林TADODataSet的问题。查询挂起

这里工作的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和分别为)。

我打算以后用一个Grid组件(通过TDataSet)使用这个TADODataSet,但是我不能让这个东西在XE8,西雅图和现在的柏林工作。它只是挂在rsGrid.Active := True。我也尝试过rsGrid.Open,但它不起作用。

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

+0

很确定它与你的问题没有关系,但你创建连接对象的方式是尖叫出内存泄漏。每次你调用这个函数'MyADOConn'时,它会创建一个新的连接实例,并且唯一的引用位于'rsGrid'内部。我希望你稍后可以将它释放,但即使如此,设计仍然存在重大缺陷,仍然可能导致大量泄漏。 –

+0

谢谢你提到杰里,但这里只是一个例子。在我的真实应用程序中,连接对象被构造并正确释放;)由MadExcept证明。 –

+0

如果用TAdoQuery替换TAdoDataSet,是否可以使用Object Inspector在IDE中成功打开它? – MartynA

回答

2

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

由于某些原因,当您使用TADODataSet组件移植窗体时,它会丢失一些关键属性。换句话说,当转移组件时会遗漏一些属性(即LockType := ltOptimistic),这些属性在我的特殊情况下很重要。

如何使它工作
要把代码起死回生,只需重新地方表格上的TADODataSet组件(将其删除,并放置一个新的)。