sql 上有一个存储过程大约是这样的:
CREATE PROCEDURE proname   
 AS
declare @s2 varchar
set @s2 ='select * into _tmp from tablename'
exec (@s2)
select * from _tmp我原来是用ODBC开发的。我的ODBC中使用
crecordset rs(&db);
rs.open("exec proname");
这样做是可以得到正确的记录集的。
现在想把ODBC改成ado,用ado打开,就得不到正确的记录集。如果把存储过程中的exec (@s)去掉。就可以得到记录集。怎么做才能用ADO打开时,能得到正确的记录集呢?在ADO上设置,还是在存储过程中设置?

解决方案 »

  1.   

    贴一下ADO调用存储过程的代码
      

  2.   

    return SUCCEEDED(m_pRecordset->Open(_variant_t("exec proname"), 
    _variant_t((IDispatch*)m_pDatabase->GetConnection(), true),
    adOpenStatic, adLockOptimistic, 1));
      

  3.   

    m_pRecordset->Open(_variant_t("proname"),
    _variant_t((IDispatch*)m_pDatabase->GetConnection(), true),
    adOpenStatic, adLockOptimistic, adCmdStoredProc);
      

  4.   

    我试了一下,执行open后报错,《语法错误或违反访问规则》
      

  5.   

    执行存储过程, 建议用Command对象试试try
    {
    _CommandPtr cmd;
    _ParameterPtr par1;
    _ParameterPtr par2;
    _variant_t vtEmpty1( DISP_E_PARAMNOTFOUND, VT_ERROR);
    _variant_t vtEmpty2( DISP_E_PARAMNOTFOUND, VT_ERROR); cmd.CreateInstance(__uuidof(Command));
    cmd->ActiveConnection = pConn;
    cmd->put_CommandType (adCmdStoredProc);

    par1 = cmd->CreateParameter(_bstr_t(L"par1"),adChar,adParamInput ,16,vtMissing );
    par1->put_Value(_variant_t(szUserID));

    par2 = cmd->CreateParameter( _bstr_t(L"par2"), adChar, adParamInput, 16,vtMissing );
    par2->put_Value( _variant_t( szNewPassword )); cmd->Parameters->Append(par1);
    cmd->Parameters->Append(par2); cmd->put_CommandText ( _bstr_t(L"ModifyUser"));
    cmd->Execute(&vtEmpty1 ,&vtEmpty2 ,adCmdStoredProc); bChanged = ValidateUser( szUserID, szNewPassword );
    }
    catch(_com_error& e)
    {
    _bstr_t bstrMessage = ReportError( e );
    AfxMessageBox( bstrMessage, MB_ICONINFORMATION );
    }
      

  6.   

    我的系统原来是用ODBC的,大约有十多万行,存储过程有4000多行。现在想用ADO。我做了一个封装的ADO类,与原来的ODBC类中的函数一致,这样需要修改的地方就不会很多了。如果像楼上所说的这样做,要改的地方太多了。程序和存储过程能不动的就不动了。现在我的系统有40多的客户,每个客户的需求都不同,不同的地方大都集中在存储过程中,所以存储过程更不愿去改动。
      

  7.   

    我有试一下..这样的存储过程在查询分析器上执行也是不成功的..但是把存储过程改为
    CREATE PROCEDURE proname   
     AS
    declare @s2 varchar
    --set @s2 ='select * into _tmp from tablename'
    exec ('select * into _tmp from tablename')
    select * from _tmp就可以成功了..
      

  8.   

    楼上的,谢了
    晕!
    declare @s2 varchar
    set @s2 ='select * into _tmp from tablename'
    exec (@s2)

    declare @s2 varchar
    exec ('select * into _tmp from tablename')
    有什么不同啊。
    再说了,实际运用中。sql语句是动态生成,必需要先放入@s2中的,然后再执行
      

  9.   

    declare @s2 varchar
    ----------------------------------------------------------------------
    如果varchar后面不指明长度,则默认长度为1.
    declare @s2 varchar(8000)
      

  10.   

    哈,还是sql server版的zjcxc(邹建)大侠说对了。
    不用改存储过程,在程序中,在open前,先执行set nocount on
    就OK了。要改客户的存储过程太复杂了,宁可改程序了