zoukankan      html  css  js  c++  java
  • VC++以ADO方式连接SQL SERVER

    VC++以ADO方式连接SQL SERVER

     

    一、引用ADO库

         用#import引入ADO库文件,在程序的头文件中引用它(例如:stdafx.h)。

     

    #import "C:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

    二、初始化COM库

    ::CoInitialize(NULL);

    三、使用ADO库中采用的接口

         ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。

    _ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。通常同CDatabase一样,使用它创建一个数据连接,然后使用其它对象执行数据输入输出操作。

    _CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。

    _RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。

    1、使用_ConnectionPtr连接数据库(两种方式)

     

    连接数据库代码
    在程序头文件中,定义对象
      _ConnectionPtr m_pConnection;
    //连接对象
    在程序中,连接数据库的程序如下:
       HRESULT hr; 
       
    try 
       { 
         hr 
    = m_pConnection.CreateInstance(_T("ADODB.Connection"));//创建Connection对象 

        
    if(SUCCEEDED(hr)) 
        { 
         hr 
    = m_pConnection->Open("Provider=SQLOLEDB;Data Source=servername;SERVER=database;UID=sa;PWD=;","","",adModeUnknown);
         
    //这是采用非DSN方式连接数据库字符串,其中servername,"数据库服务器名";database,"数据库名";UID,"用户名";PWD,"密码";
         
    //hr=m_pConnection->Open("DSN=database;UID=sa;PWD=;","","",adModeUnknown);     
         
    //这是采用DSN方式连接数据库字符串,其中database,"在DSN中定义的数据源"
        }
        
    else
        {
          AfxMessageBox(_T(
    "连接不成功!"));
        }
      }
      
    catch(_com_error e)///捕捉异常 
      { 
       CString errormessage; 
       errormessage.Format(_T(
    "连接数据库失败!\r\n错误信息:%s"),e.ErrorMessage()); 
       AfxMessageBox(errormessage);
    ///显示错误信息 
      } 

     

      2、使用_RecordsetPtr接口

    获取表数据代码
    _RecordsetPtr MySet;  //定义记录集对象
    MySet.CreateInstance(__uuidof(Recordset));
    MySet
    ->Open("SELECT * FROM some_table",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
    //下面代码我们用_RecordsetPtr接口获取记录集数据并填充这个ListBox控件(m_list):
    _variant_t Holder
    try{
      
    while(!MySet->adoEOF)
      {
        Holder 
    = MySet->GetCollect("FIELD_1");                 //数据库中表字段名
        
    if(Holder.vt!=VT_NULL)
        m_List.AddString((
    char*)_bstr_t(Holder));
        MySet
    ->MoveNext();
      }
    }
    catch(_com_error * e) 
    {
      CString Error 
    = e->ErrorMessage();
      AfxMessageBox(e
    ->ErrorMessage());
    }

      3、使用_CommandPtr接口

    以命令及数据集方式获取表中数据代码
    _CommandPtr pCommand;
    _RecordsetPtr MySet;
    pCommand.CreateInstance(__uuidof(Command));
    pCommand
    ->ActiveConnection=m_pConnection;
    pCommand
    ->CommandText="select * from some_table";
    pCommand
    ->CommandType=adCmdText; 
    pCommand
    ->Parameters->Refresh();
    MySet
    =pCommand->Execute(NULL,NULL,adCmdUnknown);
    _variant_t TheValue 
    = MySet->GetCollect("FIELD_1");
    CString sValue
    =(char*)_bstr_t(TheValue);

    4、数据类型转换

         由于COM对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据,因此CString 类和COM对象是不兼容的,我们需要一组API来转换COM对象和C++类型的数据。_vatiant_t和_bstr_t就是这样两种对象。它们提供了通用的方法转换COM对象和C++类型的数据。

  • 相关阅读:
    用Java开发第一个APP
    去除字符串空格并竖向排列
    并发容器 concurrentHashMap--1.7 更改
    java并发容器CopyOnWriteArrayList 使用场景和内部实现分析
    java非并发容器ArrayList 和 LinkedList 优缺点比较及其实现源码分析
    并发容器之CopyOnWriteArrayList分析
    单例模式
    [Android]知识总结一:Activity
    阿里巴巴fastjson的使用问题
    java跨域请求的方式
  • 原文地址:https://www.cnblogs.com/sql4me/p/1650851.html
Copyright © 2011-2022 走看看