CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  数据库

怎么用vc调用SQL Server写的存储过程啊!

楼主smzbase(天涯海角)2005-08-17 13:07:57 在 VC/MFC / 数据库 提问

谁有关于用vc调用SQL   Server写的存储过程的详细质料以及用vc通过ado操作SQL   Server的详细质料,给我一份吧,万分感激!!! 问题点数:100、回复次数:7Top

1 楼yaya_jan(yaya)回复于 2005-08-17 13:12:07 得分 10

HRESULT   hr;     ///设定一个句柄  
          _ConnectionPtr   pConnection;     ///一个连接指针  
  CString   strSQLConnect   =   ((CManagerSys1App*)AfxGetApp())->m_strConnectMaster;  
  try  
  {  
        hr   =   pConnection.CreateInstance("ADODB.Connection");///创建Connection对象  
        if(SUCCEEDED(hr))  
        {  
  hr   =   pConnection->Open((_bstr_t)strSQLConnect,"","",adModeUnknown); ///连接数据  
  _variant_t   RecordsAffected;  
  CString   strDBName   =   ((CManagerSys1App*)AfxGetApp())->m_strDBName;  
  CString   strKill;  
  strKill.Format("exec   p_killspid   '%s'",strDBName); //kill   all   connected   link  
  pConnection->Execute((_bstr_t)strKill,&RecordsAffected,adCmdText);  
   
   
  CString   strBackup;  
  strBackup.Format("restore   database   %s   from   disk='",strDBName); //restore  
  strBackup   +=   "C:\\temp.bak";  
  strBackup   +=   "'   with   replace";  
  pConnection->Execute((_bstr_t)strBackup,&RecordsAffected,adCmdText);  
   
        }  
  }  
  catch(_com_error   e)///捕捉异常  
  {  
        CString   errormessage;  
        errormessage.Format("全系统数据恢复失败!\r\n错误信息:%s",e.ErrorMessage());  
        AfxMessageBox(errormessage);///显示错误信息  
  ///关闭数据库连接  
  if((pConnection   !=   NULL))  
  {  
  if(pConnection->State)  
  pConnection->Close();  
  pConnection   =   NULL;  
  }  
   
        return;  
  }Top

2 楼yaya_jan(yaya)回复于 2005-08-17 13:16:39 得分 5

这是一段恢复数据库的代码。  
  p_killspid是断开所有连接到要恢复的数据的连接的存储过程。  
   
  ADO的详细使用自己找吧。  
   
  注意:发布的时候,要包含微软的MDAC  
   
  Top

3 楼Jarrylogin(正经事情我不会,歪门邪道样样行)回复于 2005-08-17 13:18:52 得分 5

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

4 楼bohut(●伯虎● )回复于 2005-08-17 13:19:30 得分 50

使用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的值可以根据实际数值来定,对于输出参数,最好是根据定义确定(上例中ReturnInfo参数的       Size值可以取为100)。  
        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();  
  Top

5 楼Jarrylogin(正经事情我不会,歪门邪道样样行)回复于 2005-08-17 13:19:42 得分 10

/   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

6 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-08-17 13:38:19 得分 10

SQL   Server安装盘附带的代码有例子,自己找找看Top

7 楼masterz(www.fruitfruit.com)回复于 2005-08-17 14:00:14 得分 10

www.fruitfruit.com/vc/atl/ado.cpp  
  www.fruitfruit.com/vc/database/oracle.cppTop

相关问题

  • 请问vc下如何调用SQL SERVER的存储过程?
  • vc++(ADO)调用存储过程
  • 如何在VC中用ADO调用SQL SERVER中的存储过程?
  • Ado调用Sql server7.0存储过程
  • asp调用sql存储过程问题
  • 关于调用存储过程(SQL SERVER)
  • ※ Asp 中调用 Sql Server 存储过程 ※
  • odbc调用sql存储过程出错
  • SQL存储过程中调用 xmlhttp
  • SQL中存储过程调用存储过程,怎么取返回值

关键词

  • vc++
  • 存储过程
  • ado
  • hr
  • vc
  • 参数
  • cmmd
  • 调用
  • commandptr
  • 取值

得分解答快速导航

  • 帖主:smzbase
  • yaya_jan
  • yaya_jan
  • Jarrylogin
  • bohut
  • Jarrylogin
  • goodboyws
  • masterz

相关链接

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

广告也精彩

反馈

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