当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>Visual C++教程

VC中使用ADO调用存储过程实现方法

    开发环境是VS2005,数据库是SQL Sever 2000

    1. 在进入正题之前,先讲点别的,如何在VC中连接Sybase数据库,

   连接字符窜为,_bstr_t strCnn(\"Driver={Sybase System 11};Srvr=RRRRR;Uid=RRR_Mao_bb1;Pwd=user2\");

    这里,RRRRR是数据库的名称,已经在Sybase->sdedit中设定好了

    RRR_Mao_bb1 和 user2分别是用户名和密码

    不过使用这种基于ODBC的连接使用一段时间以后,就出现问题了,出现了“Catastrophic failure”的错误,微软的解释是  http://support.microsoft.com/kb/243349/en-us

    2. 为了使我们的调用存储过程的例子有更多的通用性,我建了有输入参数,有输出参数,有一个返回记录集,有一个返回值的存储过程,如下:

 CREATE  PROCEDURE sp_1  (
                         @pin1  int ,
                         @pin2  CHAR(10),
                         @pout1 int OUTPUT,
                         @pout2 CHAR(10)  OUTPUT
                       )
AS                      
BEGIN
  declare  @retval  int
 
  select @pout1 = @pin1 + 100
 
  select @pout2 =  left( ltrim(rtrim(@pin2)) + \'123\' , 10)
 
  select Num,Name,Date
    from TABLE1
   
  select @retval =  1236
 
  return @retval
END


    对于这个SP来说,他这些个参数是

    @RETURN_VALUE(int ,返回值) 

    @pin1 ( int  ,输入 )  

    @pin2 ( char(10)  ,输入 )

    @pout1 (int ,输入/输出)

    @pout1 ( char(10)  , 输入/输出)  

    @RETURN_VALUE是第0个参数,@pin1是第1个,依此类推

    以上信息可以在SQL 的查询分析器中看到,注意,这些参数的顺序很重要

    3.调用的前期准备

    这就不多说了,什么import 库阿,建立连接阿,什么的,不多说了。

    假定连接是pConn

    注意,这里要把pConn设定成adUseClient型

    pConn->CursorLocation =adUseClient;

    下面我要贴具体的代码了,为了精简所贴的代码,我把所有的捕获异常都没贴出来(try catch)

    4.使用Refresh的方法来调用

    先定义一些变量

  _CommandPtr     pCmd = NULL;

 _RecordsetPtr   pRecordset = NULL;

    初试化他们

 pCmd.CreateInstance(__uuidof(Command));

pRecordset.CreateInstance(_uuidof(Recordset));

pCmd->ActiveConnection = pConn;

pCmd->CommandType = adCmdStoredProc;

pCmd->CommandText=_bstr_t(_T(\"sp_1\"));  //SP Name

    然后给那些input参数赋值

 pCmd->Parameters->Refresh();  
 
pCmd->Parameters->Item[_variant_t(_bstr_t(\"@pin1\") )]->Value=_variant_t(3);  

pCmd->Parameters->Item[_variant_t(_bstr_t(\"@pin2\") )]->Value=_variant_t(\"DD\"); 


    这个refresh一定要有,调SP

 pRecordset =  pCmd->Execute(NULL,NULL,adCmdStoredProc);

int   retVal = -1;

_variant_t   VretVal ;

//GetRetVal

VretVal = pCmd->Parameters->GetItem(short(0))->Value;
 
retVal = VretVal.lVal;
  
Info.Format(_T(\"The Return Value is : %d\"),retVal);
 
MessageBox(Info);

//output1
 
VretVal = pCmd->Parameters->GetItem(short(3))->Value;
 
retVal = VretVal.lVal;
  
Info.Format(_T(\"The output1 Value is : %d\"),retVal);
 
MessageBox(Info);
 
//@pout2
 
VretVal = pCmd->Parameters->GetItem(short(4))->Value;

Info= (LPCTSTR)_bstr_t(VretVal);
 
CString info1;
 
info1.Format(_T(\"The output2 Value is : %s\"),Info);
 
MessageBox(info1);

//取记录集里面的内容

if (pRecordset->adoBOF && pRecordset->adoEOF)

  {

   MessageBox(\"没有符合条件的记录存在!\",\"提示\");

   if(pRecordset != NULL && pRecordset->State)

   {

    pRecordset->Close();

    pRecordset = NULL; 

}

   pCmd.Detach();

   return;

  }
 
  pRecordset->MoveFirst();
 
  for(;!pRecordset->adoEOF;pRecordset->MoveNext())

  {

   VRectVal = pRecordset->GetCollect(_T(\"Name\"));

   StrVal = (LPCTSTR)_bstr_t(VRectVal);

   m_list.AddString(StrVal);

  }
  if(pRecordset != NULL && pRecordset->State)
  {
   pRecordset->Close();
   pRecordset = NULL;  [Page]
  }

 

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接