当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: int winapi fcstsjjh(struct compktinfo *pstinfo, char *psndpkt, char **pprcvpkt, char **pprcvfile, ); struct compktinfo{ size_t pktlen; char filename; char dylsh[9]; long jch; }; ......
 ·请帮忙 用vc拿mac address    »显示摘要«
    摘要: 我尝试用微软的例子,但compile不成功。 用(com) from http://tangentsoft.net/wskfaq/examples/getmac-rpc.html却拿到与ipconfig/all不同,而且次次运行都不同的mac address, 它不是应该唯一的吗? 多谢. ......


如何在VC中使用带返回参数的存储过程

各位大虾,如何在用VC编写数据库程序中使用带返回参数的存储过程,以SQL   SERVER为例

NO.1   作者: wistaria

使用ADO调用存储过程  
          在ADO中调用存储过程一直是一个困扰大家的问题。其实,关于ADO调用存储过程的       方法在很多书中都有讲到,标准的做法无非是按照以下步骤进行:         1、生成并初始化一个_CommandPtr对象;         2、生成调用存储过程需要的参数,这些参数都是_ParameterPtr对象;         3、按照顺序将使用_CommandPtr的Append方法为存储过程提供参数;         4、为_CommandPtr对象指定需要使用的ADO连接;         5、使用_CommandPtr的Execute方法调用存储过程;         6、从结果中获取返回参数的值。  
        具体的过程在此我不详细描述,我想看看本文附带的代码就应该很明白了。  
        在这里我想就我使用ADO调用存储过程时的一些体会说明一下。  
      1、关于CreateParameter函数  
        该函数的原型为:CreateParameter   (Name,   Type,   Direction,   Size,   Value)  
        其中Name是参数的名称,可以指定也可以不指定;       Type是一个DataTypeEnum值,指定参数的类别,取值有adInteger、adChar等;       Direction是一个ParameterDirectionEnum值,其取值为adParamInput、adParamInputOutput、       adParamOutput、adParamReturnValue、adParamUnknown;       Size是一个Long类型的值,指示该参数值以字节计算的最大长度,例如对int型,该值可以取为sizeof(int),       对Long型,该值可以取为sizeof(long),对字符串型,可以使用该字符串的长度;       Value是一个variant类型的值,是该参数的取值。  
        在这里需要注意的是,Type参数、Direction参数以及Size参数一定要和存储过程定义时的参数相吻合,  
        例如,如果有下面一个存储过程       CREATE     PROCEDURE   SMS_Proc_Handle_All       (@UserID   Integer,         @SourAddr   Varchar(15),         @DestAddr   varchar(5000),         @AvValue   Single   output,         @ReturnInfo   varchar(100)   output       )       则Type参数的取值依次为adInteger、adChar、adChar、adSingle,adChar;       Direction参数的取值依次为adParameterIn、adParameterIn、adParameterIn、adParameterOut、adParameterOut;       对于输入参数,Size的值可以根据实际数值来定,对于输出参数,最好是根据定义确定。  
        2,关于获取Output的参数  
            获取ourput参数是大家最关注的问题,同时也是最“难”的问题,因为按照书本上的写法,经常获得不了       Output参数,其实这个问题很容易解决:在调用_CommandPtr的Execute方法时,写成       cmmd->Execute(NULL,   NULL,   adCmdStoredProc);       而不要写成       RecordsetPtr   rec   =   cmmd->Execute(NULL,   NULL,   adCmdStoredProc);       也就是说,不取返回值。       这句执行完后,使用       cmmd->Parameters->GetItem("XXXXXX")->GetValue();                                                     ^^^^^^^                                                 输出参数的名称       就可以获得输出参数的值了。  
        以下是一个通过ADO调用存储过程的部分代码:  
      _CommandPtr   cmmd;     HRESULT   hr   =   cmmd.CreateInstance(__uuidof(Command));     if(FAILED(hr))     {       AfxMessageBox("NewNetDatabase()中创建_CommandPtr对象失败");       return   0;     }     _ParameterPtr   param;     param   =   cmmd->CreateParameter(""/*NetType*/,adTinyInt,   adParamInput,         sizeof(BYTE),(BYTE)(m_nNetType+1));     cmmd->Parameters->Append(param);     param   =   cmmd->CreateParameter(""/*Name*/,adVarChar,   adParamInput,       m_strName.GetLength()+1,   _variant_t(m_strName));     cmmd->Parameters->Append(param);     param   =   cmmd->CreateParameter(""/*Desp*/,adVarChar,   adParamInput,       m_strDesp.GetLength()+1,   _variant_t(m_strDesp));     cmmd->Parameters->Append(param);     param   =   cmmd->CreateParameter("NewNetID"/*NetID*/,adInteger,   adParamOutput,       sizeof(long),   (long)m_nNewNetID);//返回参数,返回新建的网络的ID     cmmd->Parameters->Append(param);       cmmd->CommandText=_bstr_t("GSDT_NewNet");//存储过程的名称     cmmd->ActiveConnection   =   m_pConPtr;//需要使用的ADO连接     cmmd->CommandType=adCmdStoredProc;     //注意下面的一行代码,如果你写成这样,就获得不了返回参数的值     //_RecordsetPtr   rec   =   cmmd->Execute(NULL,   NULL,   adCmdStoredProc);     //我不知道这是为什么,但事实就是这样:)     cmmd->Execute(NULL,   NULL,   adCmdStoredProc);     m_nNewNetID=(long)cmmd->Parameters->GetItem("NewNetID")->GetValue();//通过参数返回值     cmmd.Detach();  
 

NO.2   作者: masterz

//   SQL   Server,   stored   procedure   ,   Command   ,   Recordset,   input   parameter,   output   parameter,   returned   recordset   from   stored   procedure  
  //execute   stored   procedure   ,   get   returned   value,   output   value,   and   returned   recordset.  
  #include   "stdafx.h"  
  #import   "C:\PROGRA~1\COMMON~1\System\ado\msado15.dll"   rename(   "EOF",   "adoEOF"   )  
      struct   InitOle  
      {  
          InitOle()     {   ::CoInitialize(NULL);   }  
          ~InitOle()   {   ::CoUninitialize();     }  
      }   _init_InitOle_;  
  void   PrintProviderError(ADODB::_ConnectionPtr   pConnection);  
   
  int   main(int   argc,   char*   argv[])  
  {  
                  printf("Create   a   adParamReturnValue   for   Command   object   to   get   return   value   of   stored   procedure\n");  
                  printf("Reference   :MSDN---Append   and   CreateParameter   Methods   Example   (VC++)\n");  
                  ADODB::_ConnectionPtr     Conn1;  
                  ADODB::_CommandPtr         Cmd1;  
                  ADODB::_RecordsetPtr     Rs1;  
                  ADODB::_ParameterPtr     retParam=   NULL;  
                  ADODB::_ParameterPtr   inParam=NULL;  
                  ADODB::_ParameterPtr   outParam=NULL;  
                  _variant_t     vtEmpty   (DISP_E_PARAMNOTFOUND,   VT_ERROR);  
                  _variant_t     vtEmpty2   (DISP_E_PARAMNOTFOUND,   VT_ERROR);  
                  _bstr_t         bstrConnect(   L"driver={sql   server};server=Cell;Database=zhg;UID=sa;PWD=;"   );  
                  //   the   following   stored   procedure   return   12345   int   value  
                  _bstr_t         bstrCreate   (   L"create   proc   sp_AdoTest(   @OutParam   int   OUTPUT,@InParam   int   )   "  
                                  L"as   "  
                                  L"select   @OutParam   =   @InParam   +   10   "  
                                  L"select   *   from   Table1"  
                                  L"return   12345"   );  
                  _bstr_t         bstrSP(L"sp_Adotest"   );  
                  try  
                  {  
                                  _bstr_t   bstrEmpty;  
                                  Conn1.CreateInstance(   __uuidof(   ADODB::Connection   )   );  
                                  Cmd1.CreateInstance(   __uuidof(   ADODB::Command   )   );  
                                  Rs1.CreateInstance(__uuidof(ADODB::Recordset));  
                                  //   Establish   connection.  
                                  Conn1->ConnectionString   =   bstrConnect;  
                                  Conn1->Open(   bstrConnect,   bstrEmpty,   bstrEmpty,   -1   );  
                                  //   Open   recordset.  
                                  Cmd1->ActiveConnection   =   Conn1;  
                                  Cmd1->CommandText             =   bstrSP;  
                                  Cmd1->CommandType             =   ADODB::adCmdStoredProc;  
                                  retParam=Cmd1->CreateParameter(_bstr_t("Return"),ADODB::adInteger,ADODB::adParamReturnValue,sizeof(int));  
                                  Cmd1->Parameters->Append(retParam);  
                                  outParam   =   Cmd1->CreateParameter(_bstr_t("OutParam"),ADODB::adInteger,ADODB::adParamOutput,sizeof(int));  
                                  Cmd1->Parameters->Append(outParam);  
                                  inParam   =   Cmd1->CreateParameter(_bstr_t("InParam"),ADODB::adInteger,ADODB::adParamInput,sizeof(int),_variant_t(   (long)   10   ));  
                                  inParam->Value=_variant_t(   (long)   10   );  
                                  Cmd1->Parameters->Append(inParam);  
                                  Cmd1->Parameters->Refresh();  
                                  Cmd1->Parameters->Item[   _variant_t(   _bstr_t("@InParam")   )   ]->Value   =_variant_t(   (long)   11   );  
                                  Rs1->put_CursorLocation(ADODB::adUseClient);  
                                  Rs1->Open((_variant_t((IDispatch   *)   Cmd1)),vtEmpty,ADODB::adOpenStatic,  
                                                  ADODB::adLockReadOnly,   -1);  
                                  //   Get   return   value   of   the   stored   procedure.adCmdUnknown  
                                  TCHAR   tcbuf[1024];  
                                  long   retvalue=Cmd1->Parameters->Item[(short)0]->Value;  
                                  long   p2=Cmd1->Parameters->Item[(short)1]->Value;  
                                  long   p3=Cmd1->Parameters->Item[(short)2]->Value;  
                                  int   recordcount=0;  
                                  if(Rs1->State==ADODB::adStateClosed)  
                                                  MessageBox(NULL,"no   recordset   is   returned   from   the   stored   procedure","Information",MB_OK);  
                                  else  
                                                  recordcount   =   Rs1->GetRecordCount();  
                                  wsprintf(tcbuf,"retvalue   of   the   stored   procedure:%d,input   value:%d,output   value:%d,record   count   :%d",retvalue,p2,p3,recordcount);  
                                  MessageBox(NULL,tcbuf,"Output",MB_OK);  
                  }  
      catch(_com_error   &e)  
      {  
              _bstr_t   bstrSource(e.Source());  
              _bstr_t   bstrDescription(e.Description());  
              printf("\nCOM   error   occurred,   Source   :   %s   \n   Description   :   %s   \n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);  
          PrintProviderError(Conn1);  
      }  
                  return   0;  
  }  
  VOID   PrintProviderError(ADODB::_ConnectionPtr   pConnection)  
  {  
      //   Print   Provider   Errors   from   Connection   object.  
      //   pErr   is   a   record   object   in   the   Connections   Error   collection.  
                  ADODB::ErrorPtr     pErr   =   NULL;  
      long             nCount   =   0;  
      long             i   =   0;  
   
      if(   (pConnection->Errors->Count)   >   0)  
      {  
              nCount   =   pConnection->Errors->Count;  
              //   Collection   ranges   from   0   to   nCount   -1.  
              for(i   =   0;   i   <   nCount;   i++)  
              {  
                  pErr   =   pConnection->Errors->GetItem(i);  
                  printf("\n\t   Error   number:   %x\t%s",   pErr->Number,   (LPCSTR)pErr->Description);  
              }  
      }  
  }


    摘要: 问题同上。谢谢。 ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE