【问题标题】:ADO Command saying that I am inserting NULL, when I'm notADO 命令说我正在插入 NULL,而我没有
【发布时间】:2026-01-15 04:15:01
【问题描述】:

我正在使用 ADO 与我的 Sybase 服务器进行通信..

这就是我执行简单命令的方式:

_ConnectionPtr m_ConnPtr;
//... Instantiate connection

_CommandPtr m_CommPtr;
m_CommPtr->CreateInstance(__uuidof(Command))
m_CommPtr->ActiveConnection = m_ConnPtr;

Variant m_variant;
m_variant.SetString("My Param Value");
_ParameterPtr ParamPtr;
ParamPtr = m_CommPtr->CreateParameter("@StrParam", (DataTypeEnum) m_variant.vt, adParamInput, NULL, m_variant);
m_CommPtr->Parameters->Append(PrmPtr);

m_CommPtr->CommandText = "EXECUTE my_stored_procedure @StrParam";

m_CommPtr->Execute(NULL, NULL, adOptionUnspecified);

@StrParam 应该是 VarChar 类型..

运行它给我一个错误:

Attempt to insert NULL value into column 'StrParam'. table 'MYTABLE'; 
column does not allow nulls. Update fails.

我不确定为什么会收到此错误,因为我正在指定它的值(“我的参数值”)..

有谁知道我做错了什么?

(我没有包含存储过程,因为我确定过程本身没有任何问题。使用相同过程的其他应用程序工作正常。所以我使用的方式一定有问题参数化命令)

【问题讨论】:

    标签: c++ sybase ado


    【解决方案1】:

    我不知道你的Variant 课程是什么。但传统的变体类型 (vt) 和 ADO 数据类型不是同义词。其次,您没有为典型的存储过程调用正确设置调用或参数。

    以下是使用标准存储过程调用和来自comutil 库的variant_t 执行此操作的方法:

    _CommandPtr m_CommPtr(__uuidof(Command));
    m_CommPtr->ActiveConnection = m_ConnPtr;
    m_CommPtr->CommandType = adoCmdStoredProc;
    m_CommPtr->CommandText = L"my_stored_procedure";
    
    // setup parameter
    variant_t vParam = L"My Param Value";
    _ParameterPtr ParamPtr = m_CommPtr->CreateParameter(L"@StrParam", adBSTR, adParamInput, 0, vParam);
    m_CommPtr->Parameters->Append(ParamPtr);
    m_CommPtr->Execute(NULL, NULL, adOptionUnspecified);
    

    请注意,ParamPtr 通常是可选的,如果您不需要其他任何参数,您可以直接将该参数附加到命令的 Parameters 集合中,如下所示:

    m_CommPtr->Parameters->Append(m_CommPtr->CreateParameter(
         L"@StrParam", adBSTR, adParamInput, 0, vParam));
    

    您使用的方法对于输入 输出的参数很常见,因为您保留参数对象引用以提取参数的输出端。我在你的电话中没有看到任何证据,这是我在这里提到它的唯一原因。

    还请注意,除非命令返回结果集的行,否则您还应该使用adExecuteNoRecords 调用执行第三个选项(这对于许多即发即弃的存储过程执行很典型)

    最后,参数的名称​​不很重要,除非您使用命令对象的NamedParameters 属性。这通常在您想要保留具有默认值的附加参数时完成,仅将特定参数设置为附加列表的一部分。

    祝你好运。

    【讨论】:

    • 感谢您的出色回答!我想我解决了这个问题,但是又遇到了一个奇怪的 ADO 错误。这是link