存储过程是以下的: 
set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
ALTER PROC [dbo].[spAddtbRepository]--插入知识库信息 
@RepositoryID numeric OUT, --知识点ID 
@RepositoryCategoryID numeric, --类型编号 
@RepositoryForRevisionyID numeric, --知识库版本ID 
@ParentRepositoryID numeric, --上级ID 
@Level int, --1级最高,依次递增 
@SerialNumber int, --在同一父ID下的序号 
@ShortText nvarchar(256), --内容简写 
@FullText nvarchar(2048), --内容 
@Hint nvarchar(2048), --提示信息,第二版新增,满足用户需求 
@Re nvarchar, --备注 在用户完成时,如果未完成该项,则提示警告用户完成该项 
@QuestionOrAnswer int, --问题答案1:问题;2:答案;3:问题答案兼有 
@Symbol nvarchar(256), --标识符 
@LastVersionRepositoryID numeric --上一个版本对应ID AS 
DECLARE @ret AS INT; 
BEGIN 
SET NOCOUNT ON 
SET @ret = 0; 
BEGIN TRY 
INSERT INTO tbRepository(RepositoryCategoryID, RepositoryForRevisionyID, 
ParentRepositoryID, [Level], SerialNumber, ShortText, [FullText], Hint, Re, 
QuestionOrAnswer, Symbol, LastVersionRepositoryID) 
VALUES(@RepositoryCategoryID, @RepositoryForRevisionyID, 
@ParentRepositoryID, @Level, @SerialNumber, @ShortText, @FullText, @Hint, @Re, 
@QuestionOrAnswer, @Symbol, @LastVersionRepositoryID) 
SELECT @ret = @@IDENTITY 
END TRY 
BEGIN CATCH 
SET @ret = 0; 
END CATCH SET @RepositoryID = @ret; 
RETURN @ret; 
END 
VC里面我这样写的: 
m_pCommand->CommandText =  _bstr_t("spAddtbRepository"); 
m_pCommand->CommandType = adCmdStoredProc; 
m_pCommand->Parameters->Refresh(); int iRet = 0; 
_ParameterPtr pParaReturnID; 
pParaReturnID = m_pCommand->CreateParameter( _bstr_t("@ret"), adInteger, adParamReturnValue, sizeof(int), iRet); 
m_pCommand->Parameters->Append(pParaReturnID); _ParameterPtr pParaID; 
pParaID = m_pCommand->CreateParameter( _bstr_t("@RepositoryID"), adNumeric, adParamOutput, sizeof(int), treeNode->iID); 
m_pCommand->Parameters->Append(pParaID); _ParameterPtr pParaCategoryID; 
pParaCategoryID = m_pCommand->CreateParameter( _bstr_t("@RepositoryCategoryID"), adNumeric, adParamInput, sizeof(int), treeNode->iType); 
m_pCommand->Parameters->Append(pParaCategoryID); _ParameterPtr pParaRevisionyID; 
pParaRevisionyID = m_pCommand->CreateParameter( _bstr_t("@RepositoryForRevisionyID"), adNumeric, adParamInput, sizeof(int), treeNode->iVersionID); 
m_pCommand->Parameters->Append(pParaRevisionyID); _ParameterPtr pParaParentRepositoryID; 
pParaParentRepositoryID = m_pCommand->CreateParameter( _bstr_t("@ParentRepositoryID"), adNumeric, adParamInput, sizeof(int), treeNode->iParentID); 
m_pCommand->Parameters->Append(pParaParentRepositoryID); _ParameterPtr pParaLevel; 
pParaLevel = m_pCommand->CreateParameter( _bstr_t("@Level"), adInteger, adParamInput, sizeof(int), treeNode->iLayID); 
m_pCommand->Parameters->Append(pParaLevel); _ParameterPtr pParaSerialNumber; 
pParaSerialNumber = m_pCommand->CreateParameter( _bstr_t("@SerialNumber"), adInteger, adParamInput, sizeof(int), treeNode->iSortNO); 
m_pCommand->Parameters->Append(pParaSerialNumber); _ParameterPtr pParaShortText; 
pParaShortText = m_pCommand->CreateParameter( _bstr_t("@ShortText"), adWChar, adParamInput, 128, _variant_t(treeNode->szSContents)); 
m_pCommand->Parameters->Append(pParaShortText); _ParameterPtr pParaFullText; 
pParaFullText = m_pCommand->CreateParameter( _bstr_t("@FullText"), adWChar, adParamInput, 128, _variant_t(treeNode->szContents)); 
m_pCommand->Parameters->Append(pParaFullText); _ParameterPtr pParaHint; 
pParaHint = m_pCommand->CreateParameter( _bstr_t("@Hint"), adWChar, adParamInput, 128, _variant_t(treeNode->szTipContents)); 
m_pCommand->Parameters->Append(pParaHint); _ParameterPtr pParaRe; 
pParaRe = m_pCommand->CreateParameter( _bstr_t("@Re"), adWChar, adParamInput, 1, NULL); 
m_pCommand->Parameters->Append(pParaRe); _ParameterPtr pParaQuestionOrAnswer; 
pParaQuestionOrAnswer = m_pCommand->CreateParameter( _bstr_t("@QuestionOrAnswer"), adInteger, adParamInput, sizeof(int), 1); 
m_pCommand->Parameters->Append(pParaQuestionOrAnswer); _ParameterPtr pParaSymbol; 
pParaSymbol = m_pCommand->CreateParameter( _bstr_t("@Symbol"), adWChar, adParamInput, 128, NULL); 
m_pCommand->Parameters->Append(pParaSymbol); _ParameterPtr pParaLastVersionRepositoryID; 
pParaLastVersionRepositoryID = m_pCommand->CreateParameter( _bstr_t("@LastVersionRepositoryID"), adNumeric, adParamInput, sizeof(int), 1); 
m_pCommand->Parameters->Append(pParaLastVersionRepositoryID); m_pCommand->Execute(NULL, NULL, adCmdStoredProc);//总是报"多步OLEDB操作产生错误",请问是怎么回事呢??

解决方案 »

  1.   

    如果我想谋个参数为NULL,该怎么传进去呢??
    m_pCommand->Parameters->Item[_variant_t(_bstr_t("@QuestionOrAnswer") )]->Value =?;//这个字段可以为空,想在数据库中传个NULL,结果不行,不给这个字段赋值,结果又出错。。
      

  2.   

    _variant_t      var;var.vt=VT_NULL;m_pCommand->Parameters->Item[_variant_t(_bstr_t("@QuestionOrAnswer") )]->Value =var; 这样??
    或者
    m_pCommand->Parameters->Item[_variant_t(_bstr_t("@QuestionOrAnswer") )]->Value = VT_NULL; 这样你都试试吧,具体我也不记得了,n久不玩ADO了
    因为,如果你从记录集取记录
    是通过
    var = pRecordset->GetCollect(_T("field"));
      if(var.vt!=VT_NULL)
      {
       str= (LPCTSTR)_bstr_t(var);
      }
    var.vt!=VT_NULL 这样来判断是否取得字段为空的
      

  3.   

    不给SP的参数赋值是肯定不行的,除非你给这个参数给个默认的参数值
    所以,你一定要传个NULL进去,穿个值为NULL的_variant_t进去关于如何将_variant_t_variant_t      var; var.vt=VT_NULL;或者
    m_pCommand->Parameters->Item[_variant_t(_bstr_t("@QuestionOrAnswer") )]->Value =_variant_t(NULL)这样?
      

  4.   

    NULL好像不行吧。我从来没见过也没用过NULL如果是整数为空,那传个-1
    如果是字符为空,那传个“”
      

  5.   

    Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)返回值返回 Parameter 对象。参数Name   可选,字符串,代表 Parameter 对象名称。Type   可选,长整型值,指定 Parameter 对象数据类型。关于有效设置请参见 Type 属性。Direction   可选,长整型值,指定 Parameter 对象类型。关于有效设置请参见 Direction 属性。Size   可选,长整型值,指定参数值最大长度(以字符或字节数为单位)。Value   可选,变体型,指定 Parameter 对象的值。你把最后一个参数“Value”的值,设为NULL,不对吗??我看你
    pParaRe = m_pCommand->CreateParameter( _bstr_t("@Re"), adWChar, adParamInput, 1, NULL);
    不就是把这个参数的值设为NULL吗??
    这样不对??
      

  6.   

    m_pCommand->Parameters->Item[_variant_t(_bstr_t("("@Symbol") )]->Value =_variant_t(NULL)
    或者m_pCommand->Parameters->Item[_variant_t(_bstr_t("("@Symbol") )]->Value =""
    都不对..
      

  7.   

    CreateParameter
    的时候,把最后一个参数设为NULL可以吗??
    m_pCommand->Parameters->Item[_variant_t(_bstr_t("@QuestionOrAnswer") )]->Value = VT_NULL;
    可以吗??
      

  8.   

    handsomerun,非常感谢你的回答。。
    这样可以:
    _variant_t      var; 
    var.vt=VT_NULL;
    m_pCommand->Parameters->Item[_variant_t(_bstr_t("@QuestionOrAnswer") )]->Value = var;
    其他的均不行。。真是奇怪哦。。
    m_pCommand->Parameters->Item[_variant_t(_bstr_t("@QuestionOrAnswer") )]->Value = var;(可以)
    m_pCommand->Parameters->Item[_variant_t(_bstr_t("@QuestionOrAnswer") )]->Value =  
    VT_NULL;(不可以)
    我觉得这两个应该是一样的阿。。真是奇怪哦。。