• 在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();

     

  • 相关阅读:
    linux使用tar命令打包压缩时排除某个文件夹或文件
    SEO误区之——静态化页面
    Usage of API documented as @since1.6+
    JAVA多线程售票问题
    nginx基本配置与参数说明
    ElasticSearch搜索实例含高亮显示及搜索的特殊字符过滤
    实例讲解Nginx下的rewrite规则
    postgresql之ctid的浅谈
    【转载】PostgreSQL分区表(Table Partitioning)应用
    PostgreSQL中使用外部表
  • 原文地址:https://www.cnblogs.com/hutaoer/p/2048833.html
Copyright © 2020-2023  润新知