参数化有没有对查询语句的限制?
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 子句,运行通过。 这是为什么?

解决方案 »

  1.   

    sql2.Format("select ? from tablename group by ?");我试了一下,不用参数化查询,直接用SQL语句也出错(不用GROUP BY 不出错)。
    这个错误应该是语句本身的问题,和参数化查询没关系。
      

  2.   

    _ParameterPtr p1 = 
                cmd->CreateParameter(_bstr_t("field_name") , 
                adBSTR , adParamInput , 
                strlen("field_name") ,
                "field_name") ; 
    field_name 是什么?字段名?还是字段的值?两者都是?
      

  3.   

    strlen(field_value)
    "field_value"
    写错了
      

  4.   

    sql2.Format("select ? from tablename group by ?");第一个?是 filed_value , 第二个?应该是filed_name你写错啦,哈哈。
      

  5.   

    sql2.Format("select ? from tablename group by field_name");这样不就行了,字段名也需要参数化?
      

  6.   

    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"
      

  7.   

    楼上的没错
    group by 字句中的字段名一定要在select的查询中,这是SQL语法上规定的
      

  8.   

    to keiy:
    你的意思就是说,在这个sql 中我不能用ParameterPtr 参出化,是不是?
      

  9.   

    可以参数化,但二个参数必须相同
    或者第一个参数为聚类函数
    (如sum,count等)
      

  10.   

    我细细看了下你贴出的程序,应该没问题的
    你最终的SQL应是
    select field_name from tablename group by field_name
      

  11.   

    select的选择字段中需要包含group by分组的字段
      

  12.   

    我试了一下,你第一次贴的没问题,如果改
    strlen(field_value)
    "field_value"
    就不对了
    不知你运行出什么错
      

  13.   

    finix (*_*) :对不起,我看错了。
    我的程序中,参数化查询中的参数,是用户的输入。
    你这个是字段名,用不用参数化查询意义不大。呵呵,看见星星了,来学习一下。
      

  14.   

    to keiy:
    出的是内存错误。你执行成功?
    能不能贴上你的代码?
      

  15.   

    我的程序在公司,用你的贴的,只是表名及字段名与你的不同,明天贴上
    不知你用的什么数据库
    直接在SQL中试试以下语句:
    select field_name from tablename group by field_name
    以保证你的表tablename存在且含有field_name字段
      

  16.   

    我试过的。
    我也觉得相当奇怪。只要不在group by 里面参数化,我的代码就可以运行
      

  17.   

    今天研究了半天,差点晕
    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=?
    --------------------------------------------------------
    我昨天的确成功过?可能是我看错了
      

  18.   

    如果要实现将变量传给SQL,可简单地
    CString sql;
    sql.Format("select %s from tablename group by %s",fdname,fdname);
    那个?主要用于传递存储过程的参数
      

  19.   

    我昨天的确成功过!
    原来,昨天我用的是acess数据库,它居然支持这样的SQLselect 'field_name' from tablename group by 'field_name'