参数化有没有对查询语句的限制?
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 子句,运行通过。 这是为什么?
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 子句,运行通过。 这是为什么?
这个错误应该是语句本身的问题,和参数化查询没关系。
cmd->CreateParameter(_bstr_t("field_name") ,
adBSTR , adParamInput ,
strlen("field_name") ,
"field_name") ;
field_name 是什么?字段名?还是字段的值?两者都是?
"field_value"
写错了
_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"
group by 字句中的字段名一定要在select的查询中,这是SQL语法上规定的
你的意思就是说,在这个sql 中我不能用ParameterPtr 参出化,是不是?
或者第一个参数为聚类函数
(如sum,count等)
你最终的SQL应是
select field_name from tablename group by field_name
strlen(field_value)
"field_value"
就不对了
不知你运行出什么错
我的程序中,参数化查询中的参数,是用户的输入。
你这个是字段名,用不用参数化查询意义不大。呵呵,看见星星了,来学习一下。
出的是内存错误。你执行成功?
能不能贴上你的代码?
不知你用的什么数据库
直接在SQL中试试以下语句:
select field_name from tablename group by field_name
以保证你的表tablename存在且含有field_name字段
我也觉得相当奇怪。只要不在group by 里面参数化,我的代码就可以运行
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=?
--------------------------------------------------------
我昨天的确成功过?可能是我看错了
CString sql;
sql.Format("select %s from tablename group by %s",fdname,fdname);
那个?主要用于传递存储过程的参数
原来,昨天我用的是acess数据库,它居然支持这样的SQLselect 'field_name' from tablename group by 'field_name'