VC的ADO编程中_CommandPtr的Execute方法中的RecordsAffected,Parameters,Options三个参数分别代表什么?能举例子说明参数用法将不胜感激!

解决方案 »

  1.   

    语法对于按行返回的 Command:Set recordset = command.Execute( RecordsAffected, Parameters, Options )对于不按行返回的 Command:command.Execute RecordsAffected, Parameters, Options返回值返回 Recordset 对象引用。参数RecordsAffected    可选,长整型变量,提供者向其返回操作所影响的记录数目。Parameters    可选,变体型数组,使用 SQL 语句传送的参数值。(用该参数传送时输出参数将不返回正确值。)Options   可选,长整型值,指示提供者如何对 Command 对象的 CommandText 属性赋值。该值可为下列常量之一:常量 说明 
    adCmdText 指示提供者应将 CommandText 赋值为命令的文本定义,如 SQL 语句。 
    adCmdTable 指示 ADO 应生成 SQL 查询以便从 CommandText 命名的表中返回所有行。 
    adCmdTableDirect 指示提供者应从 CommandText 命名的表中返回所有行。 
    adCmdStoredProc 指示提供者应将 CommandText 赋值为存储过程。 
    adCmdUnknown 指示 CommandText 中的命令类型未知。 
    adExecuteAsync 指示命令应异步执行。 
    adFetchAsync 指示 CacheSize 属性指定的初始数量之后的行应异步提取。 
    本列表中前 4 个常量的详细说明请参见 CommandType 属性。说明使用 Command 对象的 Execute 方法可执行在对象的 CommandText 属性中指定的查询。如果 CommandText 属性指定按行返回查询,执行所产生的任何结果都将存储在新的 Recordset 对象中。如果该命令不是按行返回查询,则提供者返回关闭的 Recordset 对象。某些应用程序语言允许忽略该返回值(如果不需要任何 Recordset)。如果查询带有参数,将使用 Command 对象中参数的当前值,除非通过 Execute 调用传送的参数覆盖它们。可以在调用 Execute 方法时通过省略某些参数的新值来覆盖参数子集。指定参数的次序与其在方法中被传送的次序相同。例如,如果有 4 个(或更多)参数并且希望只为第一个和第四个参数传送新值,则可以将 Array(var1,,,var4) 作为 Parameters 参数传送。注意    在 Parameters 参数中传送时输出参数将不返回正确的值。该操作结束后将产生 ExecuteComplete 事件。
      

  2.   

    下面代码是我以前做的例子,可以执行,你参考一下。void CProcParameterDlg::OnBtnExec() 
    {
    // TODO: Add your control notification handler code here
    UpdateData(); _ConnectionPtr pConn;
    //_RecordsetPtr pReco;
    _CommandPtr pCmd;
    _ParameterPtr pParam1, pParam2, pParam3, pParam4, pParam5;
    try
    {
    pConn.CreateInstance("ADODB.Connection");
    pConn->Open("Provider=SQLOLEDB;SERVER=Name;DATABASE=Pubs;UID=sa;PWD=",
    "", "", -1);
    //pReco.CreateInstance("ADODB.Recordset");
    pCmd.CreateInstance(__uuidof(Command)); pCmd->ActiveConnection = pConn;
    pCmd->CommandType = adCmdStoredProc;
    pCmd->CommandText = "TestParam";

    pParam5 = pCmd->CreateParameter(_bstr_t("Return"), adInteger, adParamReturnValue, 2);
    pCmd->Parameters->Append(pParam5); pParam3 = pCmd->CreateParameter(_bstr_t("@nParam3"), adInteger, adParamOutput, 4);
    pCmd->Parameters->Append((IDispatch*)(pParam3));
    pParam4 = pCmd->CreateParameter(_bstr_t("Output2"), adVarChar, adParamOutput, 20);
    pCmd->Parameters->Append(pParam4); pParam1 = pCmd->CreateParameter(_bstr_t("Input1"), adInteger, adParamInput, 4);
    pCmd->Parameters->Append(pParam1);
    pParam2 = pCmd->CreateParameter(_bstr_t("Input2"), adVarChar, adParamInput, 20);
    pCmd->Parameters->Append(pParam2);

    pParam2->Value = _variant_t(m_strInput2);
    pParam1->Value = _variant_t((short)m_nInput1); pCmd->Execute(NULL, NULL, adCmdStoredProc); m_nOutput3 = (pParam3->Value).intVal;
    m_nRetValue = (pParam5->Value).intVal;
    m_strOutput4 = (char*)_bstr_t(pParam4->Value);
    UpdateData(FALSE); }
    catch(_com_error e) // 捕捉异常
    {
    _bstr_t bstrSource(e.Source());
    _bstr_t bs =  _bstr_t(" Error: ") + _bstr_t(e.Error()) + _bstr_t(" Msg: ") 
    + _bstr_t(e.ErrorMessage()) + _bstr_t(" Description: ") 
    + _bstr_t(e.Description());
    MessageBox(bs, bstrSource);
    }
    }
      

  3.   

    CREATE  PROC TestParam @nParam3 int OUTPUT,
                           @strParam4 varchar(50) OUTPUT,
                           @nParam1 int,
                           @strParam2 varchar(50)
                         
    ASSET @nParam3 = @nParam1
    SET @strParam4 = @strParam2IF @nParam1 > 100
       RETURN 1
    ELSE
       RETURN -1
    GO
      

  4.   

    command.Execute( RecordsAffected, Parameters, Options )