![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему при обновлении ClientDataSet [D5, MSSQL]
Ega23 © (2005-10-31 16:25:00)... ему надо заново задавать провайдера?
В ран-тайме создаю ADOQuery, DataSetProvider, ClientDataSet и DataSource.
При попытке обновления данных без задания провайдера (жирным) вылезает эксепшн "Missing data provider or data packet"
type
TForm1 = class(TForm)
aDBGrid: TDBGrid;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure CreateAll;
procedure Refresh;
public
{ Public declarations }
aQuery:TADOQuery;
aDS:TDataSource;
aCDS:TClientDataSet;
aDSP:TDataSetProvider;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.CreateAll;
var
aSQL:String;
begin
KdrDBConnection:=TKdrDBConnection.Create;
KdrDBConnection.ConnectKdr('dbsrv2', 'arm2');
aSQL:='Select * from Classes';
aQuery:=TADOQuery.Create(Self);
aQuery.SQL.Text:=aSQL;
aDSP:=TDataSetProvider.Create(Self);
aDSP.DataSet:=aQuery;
aCDS:=TClientDataSet.Create(Self);
aCDS.SetProvider(aDSP);
aDS:=TDataSource.Create(Self);
aDS.DataSet:=aCDS;
aDBGrid.DataSource:=aDS;
KdrDBConnection.ConnectQueries(Self);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateAll;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Refresh;
end;
procedure TForm1.Refresh;
begin
if aCDS.Active then
begin
aCDS.EmptyDataSet;
aCDS.Close;
end;
aQuery.Close;
aQuery.Open;
aCDS.SetProvider(aDSP);
aCDS.Open;
end;
Johnmen (2005-10-31 17:13:00) [1]>Не, так нельзя. Owner должен совпадать у провайдера и у CDS. А в моём
>случае они могут быть разные...
Хм... Ну и что?
Пропиши с учётом разных овнеров.
Ega23 (2005-10-31 17:01:00) [2]
> Я в конечном итоге так и сделал.
> Просто не совсем ясно, для чего был выбран такой странный
> путь с провайдером...
>
Не, так нельзя. Owner должен совпадать у провайдера и у CDS. А в моём случае они могут быть разные...
Ладно, буду каждый раз провайдер задавать.
Johnmen (2005-10-31 16:58:00) [3]Мне тоже не ясно...:)
Хотя смутные мысли есть по прочтении хелпа...
Ega23 (2005-10-31 16:54:00) [4]
> Видимо, потому, что источник данных для провайдера в общем
> случае может претерпеть изменения. И SetProvider критичен
> к этому......
> Я бы прописал "однократно" ProviderName для CDS.
Я в конечном итоге так и сделал.
Просто не совсем ясно, для чего был выбран такой странный путь с провайдером...
Johnmen (2005-10-31 16:50:00) [5]Видимо, потому, что источник данных для провайдера в общем случае может претерпеть изменения. И SetProvider критичен к этому......
Я бы прописал "однократно" ProviderName для CDS.
Ega23 (2005-10-31 16:35:00) [6]
> Потому, что читать Note из SetProvider + F1
Да я прочитал. Скажем так, мне непонятно зачем так сделано?
Насколько я понимаю, менять провайдера на ActiveChanged - всё равно, что Connection каждый раз для TADOQuery задавать.
Т.е. какова была мотивация при создании TClientDataSet?
Johnmen (2005-10-31 16:33:00) [7]Потому, что читать Noteиз SetProvider + F1