_RecordsetPtr prst = NULL;
prst.CreateInstance(__uuidof(Recordset));char sSql[512] = {0};
sprintf(sSql,"exec card_Test @CardNo = %.f,@PhoneNo = '%s',@ScoreUse = %f,@Consumption = %f",atof(sCard),PhoneNo,Integral,FormerMoney);try
{
_bstr_t sql=sSql;
prst->Open(sql,(IDispatch *)m_pConn,adOpenKeyset,adLockOptimistic,adCmdText);
if(!prst->adoEOF)
{
    Current_Integral = (float)atof(LPCTSTR(_bstr_t(prst->GetCollect("ScoreLeft"))));
}
prst->Close();
}
catch(_com_error &e)
{
    printf("write memory process,error code::%s,sql code:%s\n",e.ErrorMessage(),sSql);
    char str[1024] = {0};
    sprintf(str,"write memory process,error code::%s,sql code:%s",e.ErrorMessage(),sSql);
    m_log.WriteLog(1,str);
    return -2;
}
执行这个存储过程sprintf(sSql,"exec card_Test @CardNo = %.f,@PhoneNo = '%s',@ScoreUse = %f,@Consumption = %f",atof(sCard),PhoneNo,Integral,FormerMoney);插入或更新、删除就会抛出异常,请各位高手帮帮忙,小弟实在及,先谢各位了。

解决方案 »

  1.   

    在查询分析器执行是正常的在ADO下就就报错
      

  2.   

    在查询分析器执行是正常的在ADO下就就报错
      

  3.   

    插入或更新、删除就会抛出异常 应该是在这一句 if(!prst->adoEOF)
      

  4.   

    好像不是这个,我用_ConnectionPtr::Execute()也一样执行不了,好奇怪呀
      

  5.   

    ADOExecute()这个函数是需要重载的。
    ADOExecute(_RecordsetPtr &ADOSet,_variant_t &strSQL)
    {
       if(ADOSet->State==adStateOpen)
       ADOSet->Close();
       try
       {
          ADOSet->Open(strSQL,ADOConn.
          GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdUnknown);
          return true;
       }
       cateh(_com_error &e)
      { 
          CString err;
          err.Format("ADO Error:%s",(char*)e.Description());
          AfxMessageBox9err);
          return false;
       }
    }还有插入记录可以用:
    CString strQuery="insert 表名 (列名) values(字段所对应的变量...);
    theApp.ADOExecute(theApp.m_pADOSet,strQuery);
    最后请解释一下这个是什么意思呀。
    sprintf(sSql,"exec card_Test @CardNo = %.f,@PhoneNo = '%s',@ScoreUse = %f,@Consumption = %f",atof(sCard),PhoneNo,Integral,FormerMoney);
      

  6.   

    1、看看抛出什么异常?
    2、直接用数据库查询分析器执行你的语句!
    你的话是产生一个 sSql的字符串,这个字符串的功能是执行一个存储过程!
      

  7.   

    1.stdafx.h中加入
    #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 
    2。app文件的InitInstance中加入
    if(S_OK!=OleInitialize(NULL))  //或者CoInitialize()
    {
    AfxMessageBox("初始化COM组件库错误");
    }
    下面就是数据库操作
    _ConnectionPtr pConn;
    _RecordsetPtr  pRs;
    CString strSQL;
    pConn.CreateInstance(__uuidof(Connection));
    pConn->CursorLocation=adUseClient;
    strSQL="Provider=SQLOLEDB;Server=Gooyan;DataBase=SkillsBox;UID=sa;PWD=aaaaaaaa";
    pConn->Open(_bstr_t(strSQL),"","",-1);pRs.CreateInstance(__uuidof(Recordset));
    pRs->CursorLocation=adUseClient;
    pRs->PutActiveConnection(pConn.GetInterfacePtr());pRs1.CreateInstance(__uuidof(Recordset));
    pRs1->CursorLocation=adUseClient;
    pRs1->PutActiveConnection(pConn.GetInterfacePtr());strSQL="select * from catalog order by cataid";
    pRs->Open(_bstr_t(strSQL),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText);
      

  8.   

    跟踪看一下sql句子,是不是多了空格或者少了空格阿?
      

  9.   

    在MSDN中,查看CreateParameters的相关资料,你会找到答案。
    另外调用存储过程的方法,查看Execute ADO相关。
      

  10.   

    up!
    我的也是这问题,奇怪,以前做的没有这问题,查询分析器执行通过,说明语句正确,用ADO就出现不确定错误,
    ADO下 执行select * from tbl 通过
          执行select * from tbl where language='中文'通不过