在sql server 2000 中有存储过程如下
ALTER           PROC BankInfo   @strType varchar(2),
                        @strID varchar(50),
@strY  varchar(50),
@strOut varchar(1) OUTPUT
                     
AS
IF @strType='1'
BEGIN
IF NOT EXISTS (SELECT id FROM bank_card Where CAST(bank_id AS VARCHAR(50))=@strID)
BEGIN
SELECT card_brief FROM bank_card Where CAST(id AS VARCHAR(50))=@strID
SET @strOut='1'
END
ELSE
BEGIN
SELECT * FROM bank_card Where CAST(bank_id AS VARCHAR(50))=@strID
SET @strOut='0'
END
END
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GOBankInfo '2','475','企业',''在查询分析器中调用一切正常在MFC的对话框程序中
加入对ADO的
#pragma warning(disable:4146)
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
#pragma warning(default:4146)
using namespace ADODB;
加入函数测试这个存储过程
void Test(){
_ConnectionPtr m_pConn;
_CommandPtr m_pCommand;
_RecordsetPtr m_pRecord; //测试用
_variant_t afxmy;
_ParameterPtr pParam1, pParam2,pParam3,pParam4;// 参数
HRESULT hr;
char szSQL[256];
szSQL[0] =0;
sprintf(szSQL,"ty'%s','%s'","02422831991","11");
CoInitialize(NULL);
try{
hr = m_pConn.CreateInstance(__uuidof(Connection));
if(SUCCEEDED(hr))
hr = m_pConn->Open("Driver={SQL SERVER};Server=db-server;Uid=sa;PWD=;DataBase=INFO_DB"
,"","",-1);
if(SUCCEEDED(hr))
hr = m_pRecord.CreateInstance(__uuidof(Recordset));
if(SUCCEEDED(hr))
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConn;
m_pCommand->CommandType = adCmdStoredProc;
m_pCommand->CommandText = "BankInfo";
pParam1 = m_pCommand->CreateParameter(_bstr_t("@strType"), adVarChar, adParamInput, 50);
m_pCommand->Parameters->Append((IDispatch*)(pParam1));

pParam2 = m_pCommand->CreateParameter((_bstr_t("@strID")),adVarChar,adParamInput,50);
m_pCommand->Parameters->Append((IDispatch*)(pParam2));

pParam4 = m_pCommand->CreateParameter((_bstr_t("@strY")),adVarChar,adParamInput,50);
m_pCommand->Parameters->Append((IDispatch*)(pParam4));
pParam2->Value = _variant_t("2");
pParam1->Value = _variant_t("475");
pParam4->Value = _variant_t("企业业务"); pParam3 = m_pCommand->CreateParameter(_bstr_t("@strOut"),adVarChar,adParamOutput,1);
m_pCommand->Parameters->Append((IDispatch*)(pParam3)); m_pRecord = m_pCommand->Execute(NULL,NULL,adCmdStoredProc); CString test = (LPCSTR)_bstr_t(m_pRecord->GetCollect("operation_brief"));//这条语句会异常
//然后打掉上面的语句换成下面的
string strField,strValue;
FieldsPtr pfs = m_pRecord->GetFields();
_variant_t vFieldCount = m_pRecord->GetFields()->Count;
int iFieldCount = vFieldCount.intVal;
i = 0;
strField = (m_pRecord->GetFields()->Item[i])->GetName();
//发现根本没有记录集返回 这是什么原因?如何解决?
}catch (_com_error &e){
e.ErrorMessage();
}
CoUninitialize();}

解决方案 »

  1.   

    m_pRecord = m_pCommand->Execute(NULL,NULL,adCmdStoredProc);
    这句执行没有异常?
      

  2.   

    试试,把参数传递那段改成:pParam1 = m_pCommand->CreateParameter(_bstr_t("@strType"), adVarChar, adParamInput, 50,"2");
    m_pCommand->Parameters->Append((IDispatch*)(pParam1));

    pParam1 = m_pCommand->CreateParameter((_bstr_t("@strID")),adVarChar,adParamInput,50,"475");
    m_pCommand->Parameters->Append((IDispatch*)(pParam1));

    pParam1 = m_pCommand->CreateParameter((_bstr_t("@strY")),adVarChar,adParamInput,50,"企业");
    m_pCommand->Parameters->Append((IDispatch*)(pParam1));pParam1= m_pCommand->CreateParameter(_bstr_t("@strOut"),adVarChar,adParamOutput,1,"");
    m_pCommand->Parameters->Append((IDispatch*)(pParam1));