TADOQuery编程规范请问

TADOQuery编程规范请教。
如题,假若有个TADOQuery,我要设置他的sql,则应该如:
AnsiStrin sql="select * ";
sql=sql+"from t_tablename ";
sql=sql+"where id=234 ";
query1->SQL->Text=sql;
query1->Active=true;
.....
但是如果我的sql很长,那岂不是很糟糕,在cpp文件里sql岂不写的很乱?有没有好的经验介绍。

其二,我又想只使用一个TADOquery,当完成一项功能后要替换成不同的sql,即单TADOQuery多sql的方式,应该怎么组织?
我是考虑过将sql语句先保存到文本上,再读取sql来处理;或者使用的xml等具有<></>组织数据方式的形式来保存sql语句;再考虑到安全问题,打算将sql语句加密。

小弟所知甚少,有望大家指教。
谢谢。

------解决方案--------------------
1、可以把SQL写成视图或存储过程
2、再次的时候:
C/C++ code
query1->Close();
query1->SQL->Clear();
query1->SQL->Add("你的SQL");
query1->Open();

------解决方案--------------------
1 长不要紧,在字符串每行的结尾加"\",可另起一行.

2 一个Query同时只能完成一个SQL语句的操作,如果你要使用另一个SQL必须先关闭,再清空SQL,最后赋予新的SQL,再执行即可
Query->Close() ;
Query->SQL->Clear() ;

//你的操作

2.TADOQuery之filter问题
TADOQuery 通过open获得一个数据集AA后,我通过设置filter取得符合条件的数据集BB,然后把filter属性设为false,还能得到数据集AA吗

------解决方案--------------------
既然用ADOQuery 为什么不用SQL语句呢 filter有局限性
建议楼主用SQL语句 这样操作灵活 可控性强 
------解决方案--------------------
filter="xxx"//与where 子句完全一样
filtered=true;

不过滤直接
filtered=false; 
------解决方案--------------------
建议用sql语句,filter的性能要低很多。
可以把filter属性设为false,还能得到数据集AA 
------解决方案--------------------
我认为filter的性能并不低,因为它是操作当前数据集的,如果数据只是对当前的所取数据集中的数据进行操作,比用SQL快得多

3.TADOQuery的相关问题
SQL如下:
select id, count(*) as cnt from tb where id=616
在PL/SQL中能正常执行,返回:
cnt
25
但是用TADOQuery.Open()执行的时候报错“ORA-00937:不是单组分组函数”

我如果改成
select id, count(*) as cnt from tb where id=616 group by id
在PL/SQL中能正常执行,返回:
id cnt
616 25
但是在TADOQuery.Open()执行的时候报错“ORA-00979:不是GROUP BY 表达式”

请问为什么单独执行SQL就没问题,用控件就报错?怎么解决?

------解决方案--------------------
贴你的代码来看 
------解决方案--------------------
这样呢
select count(*) as cnt from tb where id=616
或者
select count(id) as cnt from tb where id=616 
------解决方案--------------------
select count(id) as cnt from tb where id=616 group by id 
------解决方案--------------------
pQry->SQL->Text = "select count(*) as cnt from tb where id=:id";
//这里少了一行,用来剖析参数的
pQry->Parameters->Items[0]->Value = Variant(id); // id=616 
------解决方案--------------------
id, count(*)这2个不能在同一个sql语句里吧 
------解决方案--------------------
id, count(*) 不能出现在同一个sql里面吧 
------解决方案--------------------

探讨
to 10楼:
我把id去掉,写成select count(*) as cnt from tb where id=616 也是一样的错误

------解决方案--------------------
String sql="select id,count(*) as cnt from tb where id=616 ";
如果是字符型则用
String sql="select id,count(*) as cnt from tb where id='616'";
 ADOQuery1->SQL->Add(sql);  
 ADOQuery1->Open(); 
------解决方案--------------------
PL/SQL里面不是标准的sql,老妖那么写是对的。ADO里面sql语句还要ado的驱动支持才行。 
------解决方案--------------------
pQry->Open();

5.


我在onclick 里写了如下代码
with ADOQuery1 do
    ADOQuery1->Close;
    ADOQuery1->SQL->Clear;
    //ADOQuery1->open ;
    ADOQuery1->SQL->Add(Se0lect IsRealDish from T_Dish);
   ADOQuery1->Open;
出现6个错误


函数调用格式不对,改成如下代码即可:

对于SQL,直接用Add()方法不好,容易出错,不妨设一个AnsiString的变量sql,更改后代码如下:
AnsiString sql;
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
sql="Select IsRealDish from T_Dish";
ADOQuery1->SQL->Add(sql);
ADOQuery1->Open();
6.String sql="create table t_aaa (id int primary key,name varchar(20),sex tinyint)";
adoquery->Close();
adoquery->SQL->Text=sql;
adoquery->ExecSQL();
。。。。。
类似如此
这是我执行插入操作的代码
AnsiString sqlstr;
   sqlstr=Edit1->Text;
   ADOQuery1->Close();
   ADOQuery1->SQL->Clear();
   ADOQuery1->SQL->Add(sqlstr);
   ADOQuery1->ExecSQL();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值