开发环境是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 |
pCmd->Parameters->Refresh(); 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; //output1 Info= (LPCTSTR)_bstr_t(VretVal); //取记录集里面的内容 if (pRecordset->adoBOF && pRecordset->adoEOF) { MessageBox(\"没有符合条件的记录存在!\",\"提示\"); if(pRecordset != NULL && pRecordset->State) { pRecordset->Close(); pRecordset = NULL; } pCmd.Detach(); return; } { VRectVal = pRecordset->GetCollect(_T(\"Name\")); StrVal = (LPCTSTR)_bstr_t(VRectVal); m_list.AddString(StrVal); } |