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.
用代码创建的语句就出错,不用代码创建的就正常,是什么原因呢?
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.
用代码创建的语句就出错,不用代码创建的就正常,是什么原因呢?
解决方案 »
- 论坛的分数有什么用啊?为什么老是谈到散分!赖分之类的话呢!
- 如何把一个整型显示成"-d,ddd,ddd.ddd..."
- 关于计算机并口的操作
- 新手请教有关数据包结构的问题:)谢谢
- 想转行搞餐饮业,帮我的饮食店起个名字,要有个凯字!!!各位帮忙想想:)
- ~~请各位大哥帮忙看看,到底错在哪里?~~~
- 求?delqhi大小写转换函数?
- 打算编写一个搜索邮件地址的软件,不知有没有钱图?
- 怎么使得 MDIChild 窗口占满 MDIMain 的整个客户区而又不是最大化?
- (高分请教)怎么样将文本框中表示十六进制的字符串转换成十进制
- 路过的大虾帮我看看串口的问题~!!
- 一个关于 Remoto Data Module 的问题
query.free;
//Project BestSoft.exe raised exception class EDatabaseError with message 'Field name missing'. Process stopped. Use Step or Run to continue.
你试试把所有的Create(self)那行去掉啊?
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的代码就不会出错!所以我很想知道这个问题是如何解决!请高手测试一下代码,就明白我的问题了。
存在把 q_d:=ADOQuery.Create(self);改成 q_d:=ADOQuery.Create(nil);试试