我试图在C ++中通过ADO运行SQL存储过程。调用该过程(为了参数)testProcedure并期望两个参数:@ param1和@param2。以下是执行方法中代码的修剪版本:
m_mCommandParameters[_T("param1")] = _T("foo");
m_mCommandParameters[_T("param2")] = _T("bar");
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection = link;
pCommand->CommandType = adCmdStoredProc;
pCommand->CommandText = _T("testProcedure");
pCommand->PutPrepared(true);
pCommand->NamedParameters = true;
// Set up the variant to store the parameter values
VARIANT vParamValue;
vParamValue.vt = VT_BSTR;
CString paramCount; // Stores the count for use as parameter name
// Iterate through set parameters and apply them to command
map<CString,CString>::iterator mItr;
for(mItr = m_mCommandParameters.begin(); mItr != m_mCommandParameters.end(); mItr++) {
paramCount = mItr->first;
vParamValue.bstrVal = _bstr_t(mItr->second);
// Append the parameter
if (mItr->second.IsEmpty()) {
_variant_t vtNULL;
vtNULL.vt = VT_NULL;
pCommand->Parameters->Append(
pCommand->CreateParameter(_bstr_t(L"@"+paramCount),adVarChar,adParamInput,10,vtNULL)
);
} else {
pCommand->Parameters->Append(
pCommand->CreateParameter(_bstr_t(L"@"+paramCount),adVarWChar,adParamInput,
//commandParameters[i].GetLength()+1,
sizeof(vParamValue),
_bstr_t(vParamValue))
);
}
}
_variant_t vRecordsAffected;
pRecordSet = pCommand->Execute(&vRecordsAffected,NULL,adCmdStoredProc);
我的理解是,这应该基本上执行以下内容:
testProcedure @param1 = 'foo', @param2 = 'bar'
如果我打开SQL管理工作室并运行上面的工作正常。但是当我尝试运行C ++时,我得到错误:
数据库错误IDispatch错误#3092 80040e14查询:testProcedure; [Microsoft] [ODBC SQL Server驱动程序]语法错误或访问冲突。
我只有SQL express,所以没有SQL profiler;我通常使用Express Profiler但由于某种原因它不会在存储过程中显示任何跟踪。所以我不知道如何开始调试。
谢谢!