unit Utest;interfaceuses
  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.
用代码创建的语句就出错,不用代码创建的就正常,是什么原因呢?

解决方案 »

  1.   

    那样创建的对象需要手动释放
    query.free;
      

  2.   

    //如果使用这四句动态创建的代码,cds_m.Open;时就会出错,信息如下:
    //Project BestSoft.exe raised exception class EDatabaseError with message 'Field name missing'. Process stopped. Use Step or Run to continue.
      

  3.   

    你的所有控件都加在窗体上了吧。你再创建的话,会不会有错啊?
    你试试把所有的Create(self)那行去掉啊?
      

  4.   

    大家看一下这两个部分://这一部分是用代码创建一个TADOQuery ,称为A
      q_d:=ADOQuery.Create(self);
      q_d.Connection:=ADOConnection1;
      q_d.SQL.Text:='select * from test_d where a=:a';
      q_d.DataSource:=ds_m;
    //这个ADOQuery2是窗体上加的控件  ,称为B
      ADOQuery2.SQL.Text:='select * from test_d where a=:a';
      ADOQuery2.DataSource:=ds_m;A和B的代码功能都是一样的,问题是用A代码就出错,错误码信息是:
    Project BestSoft.exe raised exception class EDatabaseError with message 'Field name missing'. Process stopped. Use Step or Run to continue.用B的代码就不会出错!所以我很想知道这个问题是如何解决!请高手测试一下代码,就明白我的问题了。
      

  5.   

    q_d的datasource对象存在吗?
     存在把  q_d:=ADOQuery.Create(self);改成 q_d:=ADOQuery.Create(nil);试试