ADO Command说我插入NULL,当我不是

时间:2014-07-28 21:40:07

标签: c++ sybase ado

我正在使用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.

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

有谁知道我做错了什么?

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

1 个答案:

答案 0 :(得分:1)

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

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

_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属性,否则参数的名称​​不很重要。这通常在您具有要保留的默认值的其他参数时完成,仅将特定参数设置为附加列表的一部分。

祝你好运。