如何使用ADO和C ++将null传递给存储过程输入参数

时间:2014-08-20 05:34:37

标签: c++ sql-server stored-procedures ado

技术:Microsoft SQL Server 2008,ADO,C ++。

代码:

pCommand->CommandType = ADODB::adCmdStoredProc;
pCommand->CommandText = "MyProc";

...

ADODB::_ParameterPtr pParam_ID = pCommand->CreateParameter("ID", 
    ADODB::adInteger, ADODB::adParamInput, sizeof(long));
hr = pCommand->Parameters->Append(pParam_ID);
if(FAILED(hr)) _com_issue_error(hr);
...
pCommand->Execute(NULL, NULL, 
    ADODB::adCmdStoredProc | ADODB::adExecuteNoRecords);

虽然pComand-> Execute我得到例外:

Code: 80040e10 (IDispatch error #3088)
Source: Microsoft OLE DB Provider for SQL Server
Desc: "Procedure 'MyProc' expects parameter '@ID', which was not supplied."

将最后一个参数添加到CreateParameter后:

ADODB::_ParameterPtr pParam_ID = pCommand->CreateParameter("ID", 
    ADODB::adInteger, ADODB::adParamInput, sizeof(long), _variant_t(0));

存储过程执行时没有错误,但@ID不为空。

来自http://msdn.microsoft.com/en-us/library/ms675103%28VS.85%29.aspx

  

在C / C ++中,必须指定所有操作数。如果要指定数据类型为字符串的缺失参数,请指定包含空字符串的_bstr_t。如果要指定数据类型为Variant的缺失参数,请指定值为DISP_E_PARAMNOTFOUND且类型为VT_ERROR的_variant_t。或者,指定由#import指令提供的等效_variant_t常量vtMissing。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

解决:

_variant_t v_ID;
v_ID.vt = VT_NULL; // by default vt is VT_EMPTY

// by default if last parameter not provided 
// it equals vtMissing (it isn't VT_NULL equivalent)
ADODB::_ParameterPtr pParam_ID = pCommand->CreateParameter("ID", 
    ADODB::adInteger, ADODB::adParamInput, sizeof(long), v_ID);