一个很奇怪的问题,请高手帮助!
unit Utest;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, DB, ADODB, StdCtrls, Grids, DBGrids, Provider,
DBClient , UZxyLib;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
ADOConnection1: TADOConnection;
DBGrid2: TDBGrid;
Button4: TButton;
ADOQuery2: TADOQuery;
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
a:TZxyTwoClientDataSet;
procedure BuildDataSetField(DataSet: TDataSet);
public
{ Public declarations }
q_m,q_d:tadoquery;
ds_m,ds_d,ds_cds_m,ds_cds_d:TDataSource;
dsp_m:TDataSetProvider;
cds_m,cds_d:TClientDataSet;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button4Click(Sender: TObject);
begin
q_m:=tadoquery.Create(self);
q_m.Connection:=ADOConnection1;
q_m.SQL.Text:='select * from test_m';
ds_m:=Tdatasource.Create(self);
ds_m.DataSet:=q_m;
//如果使用这四句动态创建的代码,cds_m.Open;时就会出错,信息如下:
//Project BestSoft.exe raised exception class EDatabaseError with message 'Field name missing'. Process stopped. Use Step or Run to continue.
{
q_d:=tadoquery.Create(self);
q_d.Connection:=ADOConnection1;
q_d.SQL.Text:='select * from test_d where a=:a';
q_d.DataSource:=ds_m;
}
//如果使用这两句代码就不会出错
ADOQuery2.SQL.Text:='select * from test_d where a=:a';
ADOQuery2.DataSource:=ds_m;
dsp_m:=TDataSetProvider.Create(self);
dsp_m.Name:='dsp_m';
dsp_m.DataSet:=q_m;
cds_d:=TClientDataSet.Create(self);
ds_cds_d:=Tdatasource.Create(self);
ds_cds_d.DataSet:=cds_d;
cds_m:=TClientDataSet.Create(self);
ds_cds_m:=Tdatasource.Create(self);
ds_cds_m.DataSet:=cds_m;
cds_m.ProviderName:=dsp_m.Name;
cds_m.AfterOpen:=BuildDataSetField;
cds_m.Open;
DBGrid1.DataSource:=ds_cds_m;
DBGrid2.DataSource:=ds_cds_d;
end;
procedure TForm1.BuildDataSetField(DataSet: TDataSet);
var i:integer;
begin
for i:=0 to DataSet.FieldCount - 1 do begin
if DataSet.Fields[i] is TDataSetField then begin
cds_d.DataSetField:=TDataSetField(DataSet.Fields[i]);
end;
end;
end;
end.
用代码创建的语句就出错,不用代码创建的就正常,是什么原因呢?