ADO调用存储过程如何指定参数?

freebeekf 2002-02-02 05:03:19
我用了下面的代码来调用一个存储过程
gen_menu(@uno Integer, @level Integer, @lastselect varchar(50))
在运行时总是抛出异常“至少一个参数没有被指定值”,怎么办啊?
下面是测试的存储过程和ADO代码

CREATE PROCEDURE gen_menu(
@uno Integer,@level Integer,@lastselect varchar(50)
) AS
select * from test

GO

_RecordsetPtr rs(__uuidof(Recordset));
rs.CreateInstance(__uuidof(Recordset));//初始化Recordset指针
BOOL ret=TRUE;
long cnt=0;
try{
//--------------------------------------------------------
m_pcommand->PutCommandText(L"call {gen_menu(?,?,?)}");
m_pcommand->PutCommandType(adCmdStoredProc);
m_pcommand->PutCommandTimeout(1000);
_ParameterPtr paramptr;
paramptr = m_pcommand->CreateParameter(_bstr_t("uno"),adInteger,adParamInput,sizeof(long), (long)uno);
m_pcommand->GetParameters()->Append(paramptr);
paramptr = m_pcommand->CreateParameter(_bstr_t("level"),adInteger,adParamInput,sizeof(long), (long)level);
m_pcommand->GetParameters()->Append(paramptr);
paramptr = m_pcommand->CreateParameter(_bstr_t("lastselect"),adVarChar,adParamInput,lastselect.GetLength()+1, _variant_t(lastselect));
m_pcommand->GetParameters()->Append(paramptr);
rs->Open((_Command*)m_pcommand,vtMissing,adOpenForwardOnly,adLockOptimistic,adCmdStoredProc);
rs->Fields->get_Count(&cnt);
if(cnt!=1) ret=FALSE;
else{
v.clear();
while(!rs->Get_EOF()){
string =(LPCTSTR)_bstr_t(rs->GetCollect(L"prop_value"));
v.push_back(s);
}
}
//--------------------------------------------------------
}
catch(_com_error& e){
ErrorsPtr pErrors=m_pconnection->GetErrors();
if(pErrors->GetCount()==0)
{
AfxMessageBox(e.ErrorMessage());
}
else
{
for(int i=0;i<pErrors->GetCount();i++)
{
_bstr_t esc=pErrors->GetItem((long)i)->GetDescription();
AfxMessageBox(desc);
}
}
}
catch(...)
{
AfxMessageBox("some exception occured");
}
rs->Close();
return ret;
...全文
122 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanchang 2002-02-06
  • 打赏
  • 举报
回复
同意大家的看法!
liaocao 2002-02-06
  • 打赏
  • 举报
回复
看了你的源代码,是你的CommandText写错了,不需要加?什么的
只要存储过程名,append参数就可以了
masterz 2002-02-02
  • 打赏
  • 举报
回复
//execute stored procedure , get returned value, output value, and returned recordset.
#include "stdafx.h"
#import "C:\PROGRA~1\COMMON~1\System\ado\msado15.dll" rename( "EOF", "adoEOF" )
struct InitOle
{
InitOle() { ::CoInitialize(NULL); }
~InitOle() { ::CoUninitialize(); }
} _init_InitOle_;
void PrintProviderError(ADODB::_ConnectionPtr pConnection);

int main(int argc, char* argv[])
{
printf("Create a adParamReturnValue for Command object to get return value of stored procedure\n");
printf("Reference :MSDN---Append and CreateParameter Methods Example (VC++)\n");
ADODB::_ConnectionPtr Conn1;
ADODB::_CommandPtr Cmd1;
ADODB::_RecordsetPtr Rs1;
ADODB::_ParameterPtr retParam= NULL;
ADODB::_ParameterPtr inParam=NULL;
ADODB::_ParameterPtr outParam=NULL;
_variant_t vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);
_variant_t vtEmpty2 (DISP_E_PARAMNOTFOUND, VT_ERROR);
_bstr_t bstrConnect( L"driver={sql server};server=Cell;Database=zhg;UID=sa;PWD=;" );
// the following stored procedure return 12345 int value
_bstr_t bstrCreate ( L"create proc sp_AdoTest( @OutParam int OUTPUT,@InParam int ) "
L"as "
L"select @OutParam = @InParam + 10 "
L"select * from Table1"
L"return 12345" );
_bstr_t bstrSP(L"sp_Adotest" );
try
{
_bstr_t bstrEmpty;
Conn1.CreateInstance( __uuidof( ADODB::Connection ) );
Cmd1.CreateInstance( __uuidof( ADODB::Command ) );
Rs1.CreateInstance(__uuidof(ADODB::Recordset));
// Establish connection.
Conn1->ConnectionString = bstrConnect;
Conn1->Open( bstrConnect, bstrEmpty, bstrEmpty, -1 );
// Open recordset.
Cmd1->ActiveConnection = Conn1;
Cmd1->CommandText = bstrSP;
Cmd1->CommandType = ADODB::adCmdStoredProc;
retParam=Cmd1->CreateParameter(_bstr_t("Return"),ADODB::adInteger,ADODB::adParamReturnValue,sizeof(int));
Cmd1->Parameters->Append(retParam);
outParam = Cmd1->CreateParameter(_bstr_t("OutParam"),ADODB::adInteger,ADODB::adParamOutput,sizeof(int));
Cmd1->Parameters->Append(outParam);
inParam = Cmd1->CreateParameter(_bstr_t("InParam"),ADODB::adInteger,ADODB::adParamInput,sizeof(int),_variant_t( (long) 10 ));
inParam->Value=_variant_t( (long) 10 );
Cmd1->Parameters->Append(inParam);
Cmd1->Parameters->Refresh();
Cmd1->Parameters->Item[ _variant_t( _bstr_t("@InParam") ) ]->Value =_variant_t( (long) 11 );
Rs1->put_CursorLocation(ADODB::adUseClient);
Rs1->Open((_variant_t((IDispatch *) Cmd1)),vtEmpty,ADODB::adOpenStatic,
ADODB::adLockReadOnly, -1);
// Get return value of the stored procedure.adCmdUnknown
TCHAR tcbuf[1024];
long retvalue=Cmd1->Parameters->Item[(short)0]->Value;
long p2=Cmd1->Parameters->Item[(short)1]->Value;
long p3=Cmd1->Parameters->Item[(short)2]->Value;
int recordcount=0;
if(Rs1->State==ADODB::adStateClosed)
MessageBox(NULL,"no recordset is returned from the stored procedure","Information",MB_OK);
else
recordcount = Rs1->GetRecordCount();
wsprintf(tcbuf,"retvalue of the stored procedure:%d,input value:%d,output value:%d,record count :%d",retvalue,p2,p3,recordcount);
MessageBox(NULL,tcbuf,"Output",MB_OK);
}
catch(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("\nCOM error occurred, Source : %s \n Description : %s \n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
PrintProviderError(Conn1);
}
return 0;
}



VOID PrintProviderError(ADODB::_ConnectionPtr pConnection)
{
// Print Provider Errors from Connection object.
// pErr is a record object in the Connection's Error collection.
ADODB::ErrorPtr pErr = NULL;
long nCount = 0;
long i = 0;

if( (pConnection->Errors->Count) > 0)
{
nCount = pConnection->Errors->Count;
// Collection ranges from 0 to nCount -1.
for(i = 0; i < nCount; i++)
{
pErr = pConnection->Errors->GetItem(i);
printf("\n\t Error number: %x\t%s", pErr->Number, (LPCSTR)pErr->Description);
}
}
}
liaocao 2002-02-02
  • 打赏
  • 举报
回复
嘿,又是你啊,把源代码发给我帮你搞定!
masterz 2002-02-02
  • 打赏
  • 举报
回复
#include "stdafx.h"
#import "C:\PROGRA~1\COMMON~1\System\ado\msado15.dll" rename( "EOF", "adoEOF" )
struct InitOle
{
InitOle() { ::CoInitialize(NULL); }
~InitOle() { ::CoUninitialize(); }
} _init_InitOle_;

int main(int argc, char* argv[])
{
printf("Create a adParamReturnValue for Command object to get return value of stored procedure\n");

ADODB::_ConnectionPtr Conn1;
ADODB::_CommandPtr Cmd1;
ADODB::_RecordsetPtr Rs1;
ADODB::_ParameterPtr retParam= NULL;
_variant_t vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);
_variant_t vtEmpty2 (DISP_E_PARAMNOTFOUND, VT_ERROR);
_bstr_t bstrConnect( L"driver={sql server};server=Cell;Database=zhg;UID=sa;PWD=;" );
// the following stored procedure return 12345 int value
_bstr_t bstrCreate ( L"create proc sp_AdoTest( @InParam int,@OutParam int OUTPUT ) "
L"as "
L"select @OutParam = @InParam + 10 "
L"return 12345" );
_bstr_t bstrSP ( L"sp_Adotest" );
try
{
// Establish connection.
Conn1.CreateInstance( __uuidof( ADODB::Connection ) );
Conn1->ConnectionString = bstrConnect;
_bstr_t bstrEmpty;
Conn1->Open( bstrConnect, bstrEmpty, bstrEmpty, -1 );
// Open recordset.
Cmd1.CreateInstance( __uuidof( ADODB::Command ) );
Cmd1->ActiveConnection = Conn1;
Cmd1->CommandText = bstrSP;
Cmd1->CommandType = ADODB::adCmdStoredProc;
retParam=Cmd1->CreateParameter(_bstr_t("returncode"),ADODB::adInteger,ADODB::adParamReturnValue,sizeof(int));
Cmd1->Parameters->Append(retParam);
Cmd1->Parameters->Refresh();
Cmd1->Parameters->Item[ _variant_t( (long) 1 ) ]->Value =
_variant_t( (long) 10 );
Cmd1->Execute( &vtEmpty, &vtEmpty2,ADODB::adCmdUnknown );
// Get return value of the stored procedure.
TCHAR tcbuf[1024];
long retvalue=(long)Cmd1->Parameters->Item[_variant_t(0L)]->Value;
wsprintf(tcbuf,"retvalue:%d",retvalue);
MessageBox(NULL,tcbuf,"Output",MB_OK);
}
catch(...)
{
MessageBox(NULL,"ERROR","ERROR",MB_OK);
}
return 0;
}

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧