VC++ 基于Win32控制台应用程序的ADO连接SQL server数据库

来源:互联网 发布:多益网络线上笔试题 编辑:程序博客网 时间:2024/05/18 05:37
   ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB、COM不了解也能轻松对付ADO。
  ADO使用步骤方法:

1.       初始化COM库,引入ADO库定义文件

2.       用Connection对象连接数据库

3.       利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理

4.       使用完毕后关闭连接释放对象

    开发环境:VS2008、SQL Server2005
    工程:Win32控制台应用程序
    先创建数据库mysqltest,新建一张表StuMessage,其中包含列ID、StuName、StuSex、StuAge、StuScore
    建立Win32控制台应用程序,空项目即可,这里以adotest为例,源文件为adotest.cpp
    建立C++类,类名例为CADO。
   在ADO.h的#prama once后添加:#import "c:\program files\common files\system\ado\msado15.dll no_namespace rename("EOF", "adoEOF")rename("EOF", "adoEOF")
#include <icrsint.h>
  添加两个变量:_ConnectionPtr m_pConnection
                          _RecordsetPtr m_pRecordset
  添加三个函数:void Connect(void)
                          void ExitConnect(void)
                          _RecordsetPtr& GetRecordset(_bstr_t SQL)
  在ADO.cpp中将添加的三个函数填满:
  void CADO::Connect(void)
  {
           try{
                    ::CoInitialize(NULL);  //初始化COM环境
                    m_pConnection.CreateInstance(__uuidof(Connection));  //创建连接对象
                    m_pConnection->ConnectionString="Provider=SQLNCLI.1; Persist Security Info=True; User ID=sa; Password=sa; Initial Catalog=mysqltest; Data Source="; //请将数据库相应ID与Password更改
                   //连接服务器和数据库
                   HRESULT hr=m_pConnection->Open("", "", "", 0);
                   if(hr!=S_OK)
                         cout<<"Can not connect to the specified database!"<<endl;
                 }
            catch(_com_error e){
                   cout<<e.Description()<<endl;
               }
  }
  void CADO::ExitConnect(void)
  {
        if(m_pRecordset!=NULL){
             m_pRecordset->Close();
             m_pConnection->Close();
        }
        ::CoUninitialize();  //释放环境
  }
  _RecordsetPtr& ADO::GetRecordset(_bstr_t SQL)
  {
       m_pRecordset=NULL;
       CADO link;
       try{
           if(m_pConnection==NULL)
                Connect();
           m_pRecordset.CreateInstance(__uuidof(Recordset));
           m_pRecordset->Open((_bstr_t)SQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
           }
      catch(_com_error e){
          cout<<e.Description()<<endl;
          m_pRecordset=NULL;
          return m_pRecordset;
          }
         return m_pRecordset;
  }
  主程序adotest.cpp中开头添加:#include "ADO.h"
                                                 #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")rename("EOF", "adoEOF")
                                                 #include <icrsint.h>
  主程序如下:(只是实现了简单的向数据库中写数据)
  void main()
  {
      string sql;
      CADO record; 
      _RecordsetPtr m_pRecordset;
      sql="select * from StuMessage";
      _bstr_t bstr_t(sql.c_str());
      m_pRecordset=record.GetRecordset(bstr_t);
      m_pRecordset->AddNew();
      m_pRecordset->PutCollect("ID", _variant_t("1"));
      m_pRecordset->PutCollect("StuName", _variant_t("edward"));
      m_pRecordset->PutCollect("StuSex", _variant_t("m"));
      m_pRecordset->PutCollect("StrAge", _variant_t("17"));
      m_pRecordset->PutCollect("StrScore", _variant_t("98"));
      m_pRecordset->Update();
      record.ExitConnect();
  }
  执行后,你的StuMessage表中会增加一列edward的信息。
  成功之前经历了很多错误,故将自己做成功的写出来,与大家交流分享。如果你的数据库始终连接不上(我的之前就是这个问题),你可以看一下你的1433端口打开了没有。如果没有,可以在SQL server的配置工具的配置管理器中点"网络配置"->"协议"->"TCP/IP"->"IP地址"中将TCP端口写1433。至少我这样成功了,可能会解决你连接不上的问题。
  最后,希望我写的可以对大家有帮助,祝大家好运!并诚挚感谢Sunny与技术流的帮助,如果没有你们,我什么也写不粗来...