我正在使用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.
我不确定为什么我会收到此错误,因为我正在指定其值(“我的参数值”)..
有谁知道我做错了什么?
(我没有包含存储过程,因为我确定程序本身没有任何问题。使用相同程序的其他应用程序工作正常。所以我使用的方法一定有问题参数化命令)
答案 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
属性,否则参数的名称不很重要。这通常在您具有要保留的默认值的其他参数时完成,仅将特定参数设置为附加列表的一部分。
祝你好运。