2016-05-29 1 views
1

Я пытаюсь работать в TADODataSet в программе на Delphi 10.1 БерлинПроблема с TADODataSet на Delphi 10.1 Берлин. Запрос висит

Вот мой код:

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; 

Connection свойство DataSet устанавливает следующим образом:

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 10 и 11 (Provider=SQLNCLI10.1 и Provider=SQLNCLI11.1 соответственно).

Я планирую использовать этот TADODataSet позже с компонентом Grid (через TDataSet), но я не мог заставить эту работу работать в XE8, Сиэтле и сейчас в Берлине. Он просто висит на rsGrid.Active := True. Я также пробовал rsGrid.Open, но он не работает.

В то же время он отлично компилируется и исполняется на моем XE4. Что я делаю неправильно в Берлине?

+0

Довольно точно, что это не связано с вашей проблемой, но способ создания объекта соединения - это кричать утечку памяти. Каждый раз, когда вы вызываете эту функцию «MyADOConn», он создает новый экземпляр подключения, и единственная ссылка, которую вы поддерживаете, находится внутри 'rsGrid'. Я надеюсь, что вы освободите его где-нибудь позже, но даже если это так, дизайн по-прежнему является основным недостатком и все еще может вызвать большую утечку. –

+0

Спасибо за упоминание, что Джерри, но вот только пример. В моем реальном приложении объект соединения строится и освобождается должным образом;) Проверено MadExcept. –

+0

Если вы замените TAdoDataSet на TAdoQuery, можете ли вы успешно открыть его в среде IDE с помощью Object Inspector? – MartynA

ответ

2

Вот что произошло. Я отправляю его как ответ, поэтому он может помочь другим, кто переносит код из более ранних версий Delphi XE (до XE8) в XE8/Seattle/Berlin.

По какой-то причине, когда вы переносите формы с компонентом TADODataSet, он теряет некоторые ключевые атрибуты. Другими словами, при передаче компонент пропускает некоторые атрибуты (т. Е. LockType := ltOptimistic), которые важны в моем конкретном случае.

Как заставить его работать
Чтобы получить код обратно к жизни, просто повторно местоTADODataSet компонент на форме (удалить его и поместить новый).

Смежные вопросы