在VC++中调用存储过程
最近在忙活一个小项目,需要用C++语言,在VC环境下调用数据库中已经写好的存储过程,数据库用的是sql server 2000(很老了,呵呵,不过老板坚持也没有办法啊)。之前没有学过C++,在这个项目中也主要是负责数据库编程和维护。但是小boss一声令下,我不得不从,只好赶鸭子上架了。前几天一直没有进展,今天和西工大的同学一起,终于将这个VC下调用存储过程搞定。这段小程序主要是用来对txt文本数据进行入库。这样的话,可以节约大量的时间。之前也考虑过直接用sql server的数据导入功能,但是那样子的话还需要人工对txt文档做大量的标准化处理:如修改相应的字符,标点等待,比较繁琐。所以最终还是决定用代码进行入库。
存储过程按照返回值分为有返回值和无返回值,下面我会对两种存储过程的调用分别说明。
数据库中已经有了以下两个存储过程:
1.InsertLine //插入一条数据,且不用返回值
CREATE PROCEDURE InsertLine
@oneValule varchar(50) --定义要插入的参数
As begin tran
insert into myTable(字段名) --插入语句
values(@oneValule )
commit GO
2. QueryLine //查找一条数据,返回查到的记录数
CREATE Procedure QueryLine
@key char(10), @flag int output --定义两个参数,第一个为查找的关键字,第二个为返回值(注意用output)
As begin tran
set @flag = (select count(*) from M_Navigation_Line where start_point = @startPoint and end_point = @endPoint) --查询并赋值
commit GO
接下来看源代码,先在源文件头部需要进入这样一个东东:(首先声明,我对C++不熟悉,我只能对代码做简单说明)
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
然后,声明与调用存储过程相关的类(很别扭,不知如何表达)
CoInitialize(NULL); //初始化COM环境
_ConnectionPtr pMyConnect(__uuidof(Connection));//定义连接对象并实例化对象
_RecordsetPtr pRst(__uuidof(Recordset));//定义记录集对象并实例化对象
try
{ /*打开数据库 */
pMyConnect-> Open( "DSN=databasename", "sa", "123",adModeUnknown); //连接ODBC数据源,打开管理工具进行配置,过程很简单,此处略去
}
catch (_com_error &e)
{ AfxMessageBox(e.Description()); exit(0); } //输出异常信息
//创建执行存储过程的命令对象
_CommandPtr m_pCommand;//智能指针
m_pCommand.CreateInstance("ADODB.Command");//实例
m_pCommand->ActiveConnection = pMyConnect;//设置连接
m_pCommand->CommandText = "
_ParameterPtr oneValule ; //设置参数属性
oneValule.CreateInstance("ADODB.Parameter");
//下面有五个属性值可以设置 分别是名称,类型,参数类型,长度,和值,不明白的朋友可以去网上搜搜哈。
oneValule = m_pCommand->CreateParameter("oneValule ",adVarChar,adParamInput,10,(_variant_t)“传入的值”);//给参数设置各属性
m_pCommand->Parameters->Append(oneValule );//加入到Command对象的参数集属性中,添加参数,一定要按照自己存储过程中参数的顺序
m_pCommand->Execute(NULL,NULL,adCmdStoredProc); //执行存储过程,该存储过程不带返回参数
oneValule ->Release();
如果需要获得存储过程的返回值,如调用抵用第二个存储过程
其他步骤相同,把存储过程的名字改成QueryLine ,这时候有两个参数要配置,一个是输入参数,还有一个输出参数
_ParameterPtr key; //航线终点
key.CreateInstance("ADODB.Parameter");
key= m_pCommand->CreateParameter("key",adVarChar,adParamInput,10,(_variant_t)“key值”);//给参数设置各属性
m_pCommand->Parameters->Append(ePoint);//加入到Command对象的参数集属性中
_ParameterPtr flag; //输出参数
flag.CreateInstance("ADODB.Parameter");
flag=m_pCommand->CreateParameter("flag",adInteger,adParamOutput,sizeof(long));
m_pCommand->Parameters->Append(flag);
m_pCommand->Execute(NULL,NULL,adCmdStoredProc);
int retValue = (long)m_pCommand-> Parameters-> GetItem("flag")-> GetValue(); //获取输出参数的值,赋值给retValue
pMyConnect->Close();
CoUninitialize();