【问题标题】:How to pass null to stored procedure input parameter with ADO and C++如何使用 ADO 和 C++ 将 null 传递给存储过程输入参数
【发布时间】:2014-08-20 05:34:36
【问题描述】:

技术: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 的缺失参数,请指定 _variant_t,其值为 DISP_E_PARAMNOTFOUND,类型为 VT_ERROR。或者,指定由 #import 指令提供的等效 _variant_t 常量 vtMissing。

有什么想法吗?

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 2021-12-29
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多