一个很奇怪的问题,请高手帮助!

ZXYSOSO 2006-01-07 11:20:11
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.


用代码创建的语句就出错,不用代码创建的就正常,是什么原因呢?
...全文
138 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZXYSOSO 2006-01-09
  • 打赏
  • 举报
回复
楼上,这是一个主/细关系表的,你最好用上面的代码测试一下,就知道是什么会事啦。

我按你的做法试了,也没有什么用。
gyf 2006-01-09
  • 打赏
  • 举报
回复
你的:a也没有添加
gyf 2006-01-09
  • 打赏
  • 举报
回复
q_d的datasource对象存在吗?
存在把 q_d:=ADOQuery.Create(self);改成 q_d:=ADOQuery.Create(nil);试试
ZXYSOSO 2006-01-09
  • 打赏
  • 举报
回复
大家看一下这两个部分:

//这一部分是用代码创建一个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的代码就不会出错!

所以我很想知道这个问题是如何解决!请高手测试一下代码,就明白我的问题了。
才子鸣 2006-01-09
  • 打赏
  • 举报
回复
UP
todouwang 2006-01-07
  • 打赏
  • 举报
回复
那样创建的对象需要手动释放
query.free;
ZXYSOSO 2006-01-07
  • 打赏
  • 举报
回复
怎么没有人回答呢?我顶
Delphi1985 2006-01-07
  • 打赏
  • 举报
回复
你的所有控件都加在窗体上了吧。你再创建的话,会不会有错啊?
你试试把所有的Create(self)那行去掉啊?
ZXYSOSO 2006-01-07
  • 打赏
  • 举报
回复
难道就没有知道是什么原因吗?
todouwang 2006-01-07
  • 打赏
  • 举报
回复
偶看不出错误了,8好意思
todouwang 2006-01-07
  • 打赏
  • 举报
回复
那这个错误停留在哪个代码旁边呢?
todouwang 2006-01-07
  • 打赏
  • 举报
回复
你的错误不在那里

我删除你用的控件,其他部分代码是通过的,连错误提示都不写,偶也只能做这么多了

ZXYSOSO 2006-01-07
  • 打赏
  • 举报
回复
//如果使用这四句动态创建的代码,cds_m.Open;时就会出错,信息如下:
//Project BestSoft.exe raised exception class EDatabaseError with message 'Field name missing'. Process stopped. Use Step or Run to continue.
todouwang 2006-01-07
  • 打赏
  • 举报
回复
什么错误提示?不能说么?
ZXYSOSO 2006-01-07
  • 打赏
  • 举报
回复
楼上说的都不对啊,你们要测试一下,才知道是什么原因啦
apartst 2006-01-07
  • 打赏
  • 举报
回复
没有open语句

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧