2016-05-29 93 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組件(將其刪除,並放置一個新的)。