kobe

快乐工作:前端;健康生活:篮球;爱笑笑

在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 = "

InsertLine
";//存储过程名称为InsertLine  

 

 

  _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(); 

pMyConnect->Close();
    CoUninitialize();

 

如果需要获得存储过程的返回值,如调用抵用第二个存储过程 

  其他步骤相同,把存储过程的名字改成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();

 

 

 

posted @ 2011-05-17 14:20  胡涛儿  阅读(3380)  评论(0编辑  收藏  举报