ADOQuery 动态添加计算字段

w88529593 2009-04-03 08:53:46
ADOQuery空间是用new 动态创建的,想动态添加个计算的字段,网上找来的代码好像不行,也不知是自己不懂得如何弄


TADOQuery *adoquery=new TADOQuery(NULL);
adoquery->Connection=ADOConnection;
adoquery->SQL->Text="select * from aaa";
adoquery->Open();


主要想添加个用来表示记录序号的字段,我的想法是专门写个函数OnCalc(),然后adoquery->OnCalcFields=onCalc;但是不知道该如何添加这个动态计算的字段,希望搞过这个的高手指点迷津,在此谢过啦
...全文
444 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
autorun_bob 2010-10-29
  • 打赏
  • 举报
回复
正是我想找的!!!
勉励前行 2009-04-04
  • 打赏
  • 举报
回复
TO: w88529593
你在5楼的代碼,應該是設計期已經固化了字段列表,然後在這個基礎上再加上一個計算字段,但你的情況是:SQL是後期再加上的,字段列表是空的,設計期沒有辦法固死字段列表。
注意一下代碼需要的應用環境就行了。編程不能只會COPY代碼的。

我說的與 jjwwang 說的意思基本一致。
CACACACACA 2009-04-04
  • 打赏
  • 举报
回复
晕.写DELPHI代码习惯了.

ADOQuery1->Close();
ADOQuery1->SQL->Text = "select . ";

//另外先判断一下
TField *F = ADOQuery1->FindField("Order");
if (F=NULL) {
TStringField *F = new TStringField(this);
F->FieldName = "Order";
F->DataSet = ADOQuery1;
F->FieldKind = fkCalculated;
}
ADOQuery1->Open;
CACACACACA 2009-04-04
  • 打赏
  • 举报
回复
在设计时上双击ADOQuery1, 你先手工加上你需要的字段.(省点事. 要不然你还要写代码一个字段一个字段的加.)

然后再程序中加入我的代码. 就OK了.


ADOQuery1->Close();
ADOQuery1->SQL->Text = "select . ";

//另外先判断一下
TField *F = ADOQuery1->FindField("Order");
if F=NULL then
{
TStringField *F = new TStringField(this);
F->FieldName = "Order";
F->DataSet = ADOQuery1;
F->FieldKind = fkCalculated;
}
ADOQuery1->Open;
xjq2003 2009-04-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 PPower 的回复:]
DataSet一旦Open , 是不允許修改字段列表的。
要自定義字段列表,是有些無奈。
1、通過另一個DataSet 用 select top 0 * from table 取得字段列表。
TADOQuery *tmpds=new TADOQuery(NULL);
tmpds->Connection=ADOConnection;
tmpds->SQL->Text="select top 0 * from aaa";
tmpds->Open();
2、為目的DataSet構造需要的字段。
TADOQuery *adoquery=new TADOQuery(NULL);
adoquery->Connection=ADO…
[/Quote]

这个解释的详细,我来学习了
w88529593 2009-04-04
  • 打赏
  • 举报
回复
或许目前除了构造两个TADOQuery对象,然后将一个adoquery->Open后,遍历其字段列表添加到另一个adoquery里面,然后再把动态计算的字段也添加进去,暂时没其他更好的方法了,那就这样了
w88529593 2009-04-04
  • 打赏
  • 举报
回复
void __fastcall OnCalc() 
{
adoquery->FieldByName("Order")->AsString=IntToStr(adoquery->RecNo);
}
w88529593 2009-04-04
  • 打赏
  • 举报
回复
我在网上找了端代码,但是不知道该如何去调用,测试了好几次都出现异常,代码如下:

void __fastcall TForm1::AddCalcField(String FdName, TADOQuery *DSName, TStringField *dt)
{
static count = 0;
if( DSName->FindField(FdName)!= NULL)
return;
DSName->Close();
try
{
dt = new TStringField(DSName);
{

dt->FieldName = FdName;
dt->DisplayLabel = FdName;
dt->FieldKind = fkCalculated;
dt->Name = "Field" + String(count++);
dt->Index = DSName->FieldCount;
dt->DataSet = DSName;
DSName->FieldDefs->Update();
}
}
catch(Exception &e)
{
ShowMessage(e.Message);
}
}

我是这样调用的:

adoquery=new TADOQuery(NULL);
adoquery->Connection=ADOConnection;
adoquery->Close();
adoquery->SQL->Text="select * from aaa";
TStringField *dt;
AddCalcField("Order",adoquery,dt);
adoquery->OnCalcFields=onCalc;
adoquery->Open();

但是不行,并且在关系程序时出现异常,郁闷……

勉励前行 2009-04-03
  • 打赏
  • 举报
回复
DataSet一旦Open , 是不允許修改字段列表的。
要自定義字段列表,是有些無奈。
1、通過另一個DataSet 用 select top 0 * from table 取得字段列表。
TADOQuery *tmpds=new TADOQuery(NULL);
tmpds->Connection=ADOConnection;
tmpds->SQL->Text="select top 0 * from aaa";
tmpds->Open();
2、為目的DataSet構造需要的字段。
TADOQuery *adoquery=new TADOQuery(NULL);
adoquery->Connection=ADOConnection;
//生成應有的字段
TFieldDefs *pDefs = adoquery->FieldDefs;
pDefs->BeginUpdate();
for(int i = 0 ; i < tmpds->FieldCount ; ++i)
{
TField *f = tmpds->Fields->Fields[i];
TFieldDef *pDef = pDefs->AddFieldDef();
pDef->Name = f->FieldName;
pDef->DataType = f->DataType;
pDef->Size = f->Size;
f = pDef->CreateField(adoquery);
...這裡可以設定字段f的各種屬性
}
delete tmpds ;
pDefs->EndUpdate();
//然後加入自己額外的字段(計算字段或Lookup字段),需要的話可以設定各個字段的屬性。
....
//最後設定SQL並打開數據庫
adoquery->SQL->Text="select * from aaa";
adoquery->Open();

大概過程就是這樣。具體代碼請自行調試。這樣建立的字段列表,並不會隨著 DataSet->Close() 而被清空。

這過程代碼比較多,不知道是否有更簡潔的方式來達到同樣的目的。
w88529593 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jjwwang 的回复:]
ADOQuery1->Close();
ADOQuery1->SQL->Text = "select . ";
TStringField *F = new TStringField(this);
F->FieldName = "Order";
F->DataSet = ADOQuery1;
F->FieldKind = fkCalculated;
ADOQuery1->Open;
[/Quote]

你好啊,这方法我刚试过,我把SQL改为select * from aaa,然后用你的这个方面,那么查出来的结果集中在表格里面只显示了这个Order的字段,其他我表中的子都都没有显示出来,不知道怎么回事
CACACACACA 2009-04-03
  • 打赏
  • 举报
回复
ADOQuery1->Close();
ADOQuery1->SQL->Text = "select . ";
TStringField *F = new TStringField(this);
F->FieldName = "Order";
F->DataSet = ADOQuery1;
F->FieldKind = fkCalculated;
ADOQuery1->Open;
w88529593 2009-04-03
  • 打赏
  • 举报
回复
void __fastcall OnCalc()
{
adoquery->FieldByName("Order")->AsInteger=adoquery->RecNo;
}

其中这个Order就是想动态添加的字段,用来表示记录的序号,但是不知道如何动态添加到adoquery

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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