我是菜鸟,在学者弄ADO的存储过程,先是弄掉参数,然后学返回参数。数据库表 test
num varchar(10)
name varchar(10)
下面是我的存储过程
CREATE PROCEDURE  test1 
@na varchar(15),
@nu varchar(100)  output as 
select name from test where num = @nu代码
CoInitialize(NULL);
CString cvar1;
cvar1 = "ly";

_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
_CommandPtr pCmd(__uuidof(Command));pConn->ConnectionString = "Provider=SQLOLEDB.1;Password="";Persist Security Info=True;User ID=sa;Initial Catalog=test";
pConn->Open("","","",adOpenUnspecified);
pCmd->ActiveConnection = pConn;
pCmd->CommandType = adCmdStoredProc;
pCmd->CommandText = _bstr_t("test1");
_ParameterPtr pam = NULL;
pam.CreateInstance(__uuidof(Parameter));

_variant_t vvar1;
vvar1=_variant_t(_bstr_t(cvar1));pam = pCmd->CreateParameter(_bstr_t("var1"),adVarChar,adParamInput,100,vvar1);
pCmd->Parameters->Append(pam);
pCmd->Execute(NULL, NULL, adCmdStoredProc);CoUninitialize();代码是执行到execute出错,报runtime错误。
菜鸟,不知道是我的数据类型还是那个地方出错了。

解决方案 »

  1.   


    _ConnectionPtr pConn(__uuidof(Connection)); 
    _RecordsetPtr pRst(__uuidof(Recordset));
    改成:
    _ConnectionPtr pConn;
    _RecordsetPtr pRst;
    pConn.CreateInstance(__uuidof(Connection));
    pRst.CreateInstance(__uuidof(Recordset));然后,把你的代码用如下代码包起来:
    try
    {
        //你的代码
    }
    catch(_com_error &e)
    {
        AfxMessageBox(e.Description());
    }
      

  2.   

    好像是我的存储过程中的where写错了!~
      

  3.   

    现在改好了,返回值也弄好了 ,代码如下
    pConn->ConnectionString = "Provider=SQLOLEDB.1;Password="";Persist Security Info=True;User ID=sa;Initial Catalog=test";
    pConn->Open("","","",adOpenUnspecified);
    pCmd->ActiveConnection = pConn;
    pCmd->CommandType = adCmdStoredProc;
    pCmd->CommandText = _bstr_t("test1");
    _ParameterPtr pam = NULL;
    pam.CreateInstance(__uuidof(Parameter));

    _variant_t vvar1,vvar2;
        vvar1=_variant_t(_bstr_t(cvar1));    pam = pCmd->CreateParameter(_bstr_t("var1"),adVarChar,adParamInput,10,vvar1);
    pCmd->Parameters->Append(pam);
    pam = pCmd->CreateParameter(_bstr_t("var2"),adVarChar,adParamOutput,10,vvar2);
    pCmd->Parameters->Append(pam);
        pRst =pCmd->Execute(NULL, NULL, adCmdStoredProc);但是不知道用什么方法去得到pRst中返回的值,哪位高手能告诉我得到pCmd中的值得方法吗?
      

  4.   

    试试以存储过程名为字段名访问pRst行不行??
      

  5.   

    有没有哪个高手教我怎么得到存储过程中的返回值啊??
    网上说的几个方法都试了
    不行。
    _bstr_t strRecord = pRst->Fields->GetItem("num")->GetValue().bstrVal;   如这里的bstrVal就报错num=(_bstr_t)pCmd->Parameters->get_Item ('2',"test1")->getvalue();
    pCmd->Parameters->get_Item(2,_bstr_t("var2"));这两个都有问题,本人菜鸟实在是不知道,谢谢前辈指点!~~~~~~~~·
      

  6.   

    如下面的方法访问试试:
    _variant_t var = pRst->GetCollect("num");
    AfxMessageBox((LPCSTR)_bstr_t(var));
      

  7.   

    不对
    你上面那不是调用存储过程的方法吧
    是不是执行SQL的方法啊
      

  8.   

    是访问记录集的方法,存储过程的返回值不是已经赋给pRst记录集了吗??