ADO的参数化查询(关键字:ADO 参数化查询 , _ParameterPtr,

finix 2005-04-28 03:47:50
参数化有没有对查询语句的限制?
try
{

_CommandPtr cmd ;

cmd.CreateInstance(__uuidof(Command)) ;
cmd->Prepared = true;
CString sql2;
sql2.Format("select ? from tablename group by ?");
_ParameterPtr p1 =
cmd->CreateParameter(_bstr_t("field_name") ,
adBSTR , adParamInput ,
strlen("field_name") ,
"field_name") ;
cmd->Parameters->Append(p1) ;
_ParameterPtr p2 =
cmd->CreateParameter(_bstr_t("field_name") ,
adBSTR , adParamInput ,
strlen("field_name") ,
"field_name") ;
cmd->Parameters->Append(p2) ;
cmd->ActiveConnection = m_pConnection ;
cmd->CommandText = (LPCTSTR)sql2 ;
_variant_t vEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
_RecordsetPtr set = cmd->Execute(NULL,&vEmpty,adCmdText) ;
运行出错
如果不加group by 子句,运行通过。 这是为什么?
...全文
891 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
柯本 2005-04-29
  • 打赏
  • 举报
回复
我昨天的确成功过!
原来,昨天我用的是acess数据库,它居然支持这样的SQL

select 'field_name' from tablename group by 'field_name'
柯本 2005-04-29
  • 打赏
  • 举报
回复
如果要实现将变量传给SQL,可简单地
CString sql;
sql.Format("select %s from tablename group by %s",fdname,fdname);
那个?主要用于传递存储过程的参数
柯本 2005-04-29
  • 打赏
  • 举报
回复
今天研究了半天,差点晕
select ? from tablename
中的?当用参数时,会直接用值去替换,而非变量
如当参数为field_name时,相当于执行了
select 'field_name' from tablename
这样,第一个字段的值全部为'field_name' 而非field_name字段的内容
所以,当你用
select ? from tablename group by ?时
相当于执行了:
select 'field_name' from tablename group by 'field_name'
当然不可能执行成功
关键是VC就返回一个runtime error ,用catch(_com_error *e) 不会截获错误,所以一直不知错在哪里

在group by 中加?是不能执行的,在select中加?也不会得到预期的结果
这样是可以用的
select field_anme from tablename where field_name=?
--------------------------------------------------------
我昨天的确成功过?可能是我看错了
finix 2005-04-29
  • 打赏
  • 举报
回复
up
finix 2005-04-28
  • 打赏
  • 举报
回复
我试过的。
我也觉得相当奇怪。只要不在group by 里面参数化,我的代码就可以运行
柯本 2005-04-28
  • 打赏
  • 举报
回复
我的程序在公司,用你的贴的,只是表名及字段名与你的不同,明天贴上
不知你用的什么数据库
直接在SQL中试试以下语句:
select field_name from tablename group by field_name
以保证你的表tablename存在且含有field_name字段
finix 2005-04-28
  • 打赏
  • 举报
回复
to keiy:
出的是内存错误。你执行成功?
能不能贴上你的代码?
sungengyu 2005-04-28
  • 打赏
  • 举报
回复
finix (*_*) :对不起,我看错了。
我的程序中,参数化查询中的参数,是用户的输入。
你这个是字段名,用不用参数化查询意义不大。

呵呵,看见星星了,来学习一下。
柯本 2005-04-28
  • 打赏
  • 举报
回复
我试了一下,你第一次贴的没问题,如果改
strlen(field_value)
"field_value"
就不对了
不知你运行出什么错
oyljerry 2005-04-28
  • 打赏
  • 举报
回复
select的选择字段中需要包含group by分组的字段
柯本 2005-04-28
  • 打赏
  • 举报
回复
我细细看了下你贴出的程序,应该没问题的
你最终的SQL应是
select field_name from tablename group by field_name
finix 2005-04-28
  • 打赏
  • 举报
回复
什么叫做参数相同?
我上面的例子是不是算相同呢?
柯本 2005-04-28
  • 打赏
  • 举报
回复
可以参数化,但二个参数必须相同
或者第一个参数为聚类函数
(如sum,count等)
finix 2005-04-28
  • 打赏
  • 举报
回复
to keiy:
你的意思就是说,在这个sql 中我不能用ParameterPtr 参出化,是不是?
柯本 2005-04-28
  • 打赏
  • 举报
回复
楼上的没错
group by 字句中的字段名一定要在select的查询中,这是SQL语法上规定的
finix 2005-04-28
  • 打赏
  • 举报
回复
sql2.Format("select ? from order group by ?");
_ParameterPtr p1 =
cmd->CreateParameter(_bstr_t("a") ,
adBSTR , adParamInput ,
strlen("order_id") ,
"order_id") ;
cmd->Parameters->Append(p1) ;
_ParameterPtr p2 =
cmd->CreateParameter(_bstr_t("b") ,
adBSTR , adParamInput ,
strlen("order_id") ,
"order_id") ;
cmd->Parameters->Append(p2) ;
cmd->ActiveConnection = m_pConnection ;
cmd->CommandText = (LPCTSTR)sql2 ;
_variant_t vEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
_RecordsetPtr set = cmd->Execute(NULL,&vEmpty,adCmdText) ;
试试看
应该执行的sql是“select order_id from order group by order_id"
sungengyu 2005-04-28
  • 打赏
  • 举报
回复
sql2.Format("select ? from tablename group by field_name");

这样不就行了,字段名也需要参数化?

sungengyu 2005-04-28
  • 打赏
  • 举报
回复
sql2.Format("select ? from tablename group by ?");

第一个?是 filed_value , 第二个?应该是filed_name

你写错啦,哈哈。
finix 2005-04-28
  • 打赏
  • 举报
回复
strlen(field_value)
"field_value"
写错了
sungengyu 2005-04-28
  • 打赏
  • 举报
回复
_ParameterPtr p1 =
cmd->CreateParameter(_bstr_t("field_name") ,
adBSTR , adParamInput ,
strlen("field_name") ,
"field_name") ;


field_name 是什么?字段名?还是字段的值?两者都是?

加载更多回复(1)

4,011

社区成员

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

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