CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  数据库

VC如何调用存储过程

楼主foolish2002()2003-09-25 15:50:10 在 VC/MFC / 数据库 提问

_ConnectionPtr     m_connection;  
  _RecordsetPtr     m_recordset;  
  _CommandPtr         m_command;  
  HRESULT     hr,hr1,hr2,hhc;  
  //m_connection->CommandTimeout=10;  
  //AfxMessageBox("chao     shi");    
  hr=m_connection.CreateInstance("ADODB.connection");  
  if   (SUCCEEDED(hr))  
  {  
  hr1=m_connection->Open("DSN=cc","","",-1);  
  AfxMessageBox("cheng     gong     ");  
  }  
  else  
  {  
  AfxMessageBox("shi     bai");  
  }  
   
   
  if(SUCCEEDED(hr1))  
  {  
  CString   sql_;  
  _bstr_t   sql;  
  sql_.Format("test1");  
  sql=sql_;  
  VARIANT     RecordsetAffected;  
                  _variant_t     vtEmpty   (DISP_E_PARAMNOTFOUND,   VT_ERROR);  
                  _variant_t     vtEmpty2(DISP_E_PARAMNOTFOUND,   VT_ERROR);  
  hr=m_recordset.CreateInstance("ADODB.recordset");  
  hr2=m_command.CreateInstance("ADODB.command");  
  VARIANT     v1,v2;  
  //m_recordset=m_connection->Execute(sql,&RecordsetAffected,4);  
   
  m_command->ActiveConnection=m_connection;  
  m_command->CommandText=_bstr_t(sql);  
  m_command->CommandType=adCmdStoredProc;  
  hhc=m_command->Execute(&vtEmpty,&vtEmpty2,adCmdStoredProc);  
   
  }  
   
  else  
  {  
  AfxMessageBox("bbbbbbbbbbbbbbbbbbbbbbb");  
  }  
   
  if(SUCCEEDED(hhc))  
  {  
  AfxMessageBox("BBBBBBBBBBBBBBBBBBBBBBBBB");  
  }  
   
  else  
   
  {  
  AfxMessageBox("CCCCCCCCCCCCCCCCCCCCCCC");  
  }  
  }  
  hhc总是返回S_FALSE  
   
   
  请问这是为什麽,应如何正确存储过程,请大虾帮忙可,急!!!!!!!! 问题点数:0、回复次数:3Top

1 楼duqiang2050(杜杜)回复于 2003-09-25 16:05:51 得分 0

//   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   Connection's   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);  
              }  
      }  
  }  
  Top

2 楼aben456(金珠MERP)回复于 2003-09-25 17:11:36 得分 0

 
  SQLHENV henv   =   SQL_NULL_HENV;  
  SQLHDBC hdbc   =   SQL_NULL_HDBC;  
    SQLHSTMT hstmt   =   SQL_NULL_HSTMT;  
  RETCODE   retcode;  
          retcode   =   SQLAllocHandle(SQL_HANDLE_ENV,   SQL_NULL_HANDLE,   &henv);      
   
  SQLSetEnvAttr(henv,   SQL_ATTR_ODBC_VERSION,   (SQLPOINTER)   SQL_OV_ODBC3,   SQL_IS_INTEGER);  
  retcode   =   SQLAllocHandle(SQL_HANDLE_DBC,   henv,   &hdbc);  
   
  // retcode   =   SQLConnect(hdbc,   (SQLCHAR*)   "ORACLEDSN",   SQL_NTS,   (SQLCHAR*)   "cmsdb",   SQL_NTS,(SQLCHAR*)   "cmsmanager",   SQL_NTS);  
  retcode   =   SQLConnect(hdbc,   (SQLCHAR*)   strDSN.GetBuffer(5),   SQL_NTS,   (SQLCHAR*)   strUID.GetBuffer(5)   ,   SQL_NTS,(SQLCHAR*)   strPWD.GetBuffer(5),   SQL_NTS);  
  strDSN.ReleaseBuffer();  
  strUID.ReleaseBuffer();  
  strPWD.ReleaseBuffer();  
  retcode   =   SQLAllocHandle(SQL_HANDLE_STMT,   hdbc,   &hstmt);  
          retcode   =   SQLPrepare(hstmt,   (SQLCHAR   *)"{call   cmsdb.PROC_96163_CHARGE(?,?,?)}",     SQL_NTS);  
  SQLINTEGER   inparm;  
  // SQLINTEGER out;  
  SQLCHAR   outparm[30];  
  ZeroMemory(outparm,   30);  
  SQLCHAR   str_inparm[10]   ;  
  ZeroMemory(str_inparm,   10);  
  long   length=SQL_NTS;  
   
  inparm   =   Account_ID;  
  retcode   =   SQLBindParameter(hstmt,   1,   SQL_PARAM_INPUT,   SQL_C_LONG     ,    
  SQL_INTEGER,   1,   0,   &inparm,   0,   &length);  
  retcode   =   SQLBindParameter(hstmt,   2,   SQL_PARAM_INPUT,   SQL_C_CHAR     ,    
  SQL_CHAR,   10,   0,   str_inparm,   10,   &length);  
          retcode   =   SQLBindParameter(hstmt,3,   SQL_PARAM_OUTPUT,   SQL_C_CHAR     ,    
  SQL_CHAR,   30,   0,   outparm,   30,   &length);  
   
  try{  
  retcode   =   SQLExecute(hstmt);  
  }catch(CDBException   *ce)  
  {  
  ce->m_strError;  
  ce->Delete();  
  }  
  if(retcode   !=   SQL_SUCCESS)  
  {  
  // retcode   =   GetLastError();  
  CString   str_ret;  
  str_ret.Format("SQLExcute返回非SQL_SUCCESS结果:%d",   retcode);  
  AddLog(str_ret);  
  }  
  if   (   (retcode   !=   SQL_SUCCESS)   &&(retcode   !=   SQL_SUCCESS_WITH_INFO)   )  
  {  
  ProcessLogMessages(SQL_HANDLE_STMT,   hstmt,"SQLExecute()   Failed\n",   TRUE);  
  if_succeed   =   FALSE;  
  }  
      SQLFreeHandle(SQL_HANDLE_STMT,   hstmt);  
  retcode   =   SQLDisconnect(hdbc);  
  retcode   =   SQLFreeHandle(SQL_HANDLE_DBC,   hdbc);  
  Top

3 楼greenery(greenery)回复于 2003-09-30 10:35:48 得分 0

//(例子)VC   6   ADO   调用存储过程,带返回值,输出参数;  
  //   自己捕获异常  
   
  _variant_t   v1,   v2,m_vReturnValue   ;  
  _ConnectionPtr pConnection;  
  _CommandPtr pCommand =   NULL;  
  _ParameterPtr pResParam =   NULL,   m_vReturnParameterPtr,   m_vOutputParameterPtr;  
   
  pConnection.CreateInstance(__uuidof(Connection));  
  pCommand.CreateInstance(__uuidof(Command));  
  v1   =   _T("test1");  
  v2   =   1L;  
   
  //   建立返回值的参数,好像必须放在第一个  
  m_vReturnParameterPtr   =   pCommand->CreateParameter(_T("RETURN_VALUE"),   adInteger,   adParamReturnValue,   4,   m_vReturnValue);  
  pCommand->Parameters->Append(m_vReturnParameterPtr);  
  //   建立一个输出参数  
  m_vOutputParameterPtr   =   pCommand->CreateParameter(_T("@a"),   adInteger,   adParamInput,   sizeof(TCHAR)*64   ,   v1);  
  pCommand->Parameters->Append(m_vOutputParameterPtr);  
  //   建立一个一般的参数  
  pResParam   =   pCommand->CreateParameter(_T("@b"),   adWChar,   adParamInputOutput,   sizeof(long)   ,   v2);  
  pCommand->Parameters->Append(pResParam);  
  //连接数据库  
  pConnection->Open(_T("Provider=SQLOLEDB;SERVER=.;DATABASE=ResourcePlat;UID=DBuser;PWD=password"),   _T(""),   _T(""),   m_eConnectOption);  
  pCommand->ActiveConnection   =   pConnection;  
  pCommand->CommandText   =   _bstr_t(_T("p_LogDebug"));  
  pCommand->Execute(   NULL,   NULL,   adCmdStoredProc);   //执行存储过程  
   
  m_vReturnValue   =   m_vReturnParameterPtr->Value;   //   获取返回值  
  v1   =   m_vOutputParameterPtr->Value;   //   获取输出参数Top

相关问题

  • 请问vc下如何调用SQL SERVER的存储过程?
  • 如何在VC中调用存储过程??
  • 在VC中如何用ado调用包里的存储过程?
  • 如何在VC++中调用存储过程
  • 如何在存储过程中调用存储过程?
  • 如何在存储过程中调用存储过程?2
  • 存储过程中如何再调用另一存储过程?
  • 如何在存储过程中调用其它存储过程
  • 如何在存储过程中调用存储过程?
  • vc++(ADO)调用存储过程

关键词

  • 存储过程
  • retcode
  • adodb
  • inparam
  • inparm
  • sqlchar
  • vtempty
  • hstmt
  • outparam
  • hdbc

得分解答快速导航

  • 帖主:foolish2002

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo