惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Latest news
Latest news
T
Troy Hunt's Blog
V
Vulnerabilities – Threatpost
L
LINUX DO - 热门话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
V
V2EX
博客园 - 司徒正美
B
Blog RSS Feed
AWS News Blog
AWS News Blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
Cisco Talos Blog
Cisco Talos Blog
Last Week in AI
Last Week in AI
NISL@THU
NISL@THU
博客园 - Franky
P
Proofpoint News Feed
博客园_首页
C
CERT Recently Published Vulnerability Notes
雷峰网
雷峰网
S
Schneier on Security
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
G
GRAHAM CLULEY
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
WordPress大学
WordPress大学
The Hacker News
The Hacker News
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Microsoft Azure Blog
Microsoft Azure Blog
T
The Exploit Database - CXSecurity.com
Engineering at Meta
Engineering at Meta
罗磊的独立博客
T
The Blog of Author Tim Ferriss
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
K
Kaspersky official blog
SecWiki News
SecWiki News
云风的 BLOG
云风的 BLOG
美团技术团队
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Security Latest
Security Latest
C
Cyber Attacks, Cyber Crime and Cyber Security
B
Blog
S
Security Affairs

博客园 - 路人甲2

使用IBM Rational的测试理念成功打造测试团队zt 半个蛋挞 zt : java编程思想读书笔记:二万物皆对象 客户资产管理(Custom Asset Management) 打包,并自动安装SQL数据库 Microsoft Visual Studio .NET 2003制作安装程序 blog背景~ 嘿嘿,我的驾照~ Agent学习(移动代理研究现状) 移动agent学习 zt 如何把应用程序程序和ORACLE客户端一起打包 .NET 访问 Oracle 数据库相关 zt在Delphi7中屏蔽word,excel左上角的弹出菜单的关闭选项 在北京几个最频繁走过的两个地方 北信雪景-4 北信雪景-3 北信雪景-2 北信雪景-1 北京的雪
ADO 数据库连接
路人甲2 · 2005-04-16 · via 博客园 - 路人甲2

这些天一直在学习ADO 数据库连接,感觉比较复杂,所以一边学习,一边使用,一边做了一些笔记,下面的一些东西就是我总结的一些关于ADO数据库连接方面的东西,因为是笔记,所以不一定很有序,贴出来的意思一方面是可以给大家一个参考,一边也有希望大家一起来完善的意思,其中错误和不足之处当然希望大家可以及时地通知我,在贴上来的时候,我有一个想法,因为我在使用的过程中,总是会遇上一些莫明其妙的错误,所以我想大家有可能也会遇上,于是,我给出了一个错误总结,当然这里就需要大家一起来完善了,如果大家有什么心得和见解,希望在评论中留言,我会及时地接受大家的意见并把他们加进来(当然是在得到您的允许的情况下)

1、导入库文件

    使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下:
#import "C:\Program Files\common files\system\ado\msado15.dll" no_namespace rename("EOF","EndOfFile") rename("BOF","FirstOfFile")

 ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。类型库描述了自治接口,以及C++使用的COM vtable接口。当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,并以此创建一组C++头文件。这些头文件具有.tli 和.tlh扩展名,读者可以在项目的目录下找到这两个文件。在C++程序代码中调用的ADO类要在这些文件中定义。
   程序的第三行指示ADO对象不使用名称空间。在有些应用程序中,由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。如果要使用名称空间,则可把第三行程序修改为: rename_namespace("AdoNS")。第四行代码将ADO中的EOF(文件结束)更名为adoEOF,以避免与定义了自己的EOF的其他库冲突。


2、初始化COM环境
   (1)::CoInitialize(NULL); file://初始化OLE/COM库环境
        ::CoUninitialize();//既然初始化了环境,当然就有必要释放他了
   (2)也可以调用MFC全局函数
        AfxOleInit();

3、三大对象的定义和创建实例

   (1)  _ConnectionPtr pConnection("ADODB.Connection");
        _RecordsetPtr  pRecordset("ADODB.Recordset");
        _CommandPtr    pCommand("ADODN.Command");

   (2) _ConnectionPtr pConnection;
       _RecordsetPtr  pRecordset;
       _CommandPtr    pCommand;

       pConnection.CreateInstance(__uuidof(Connection));
       pRecordset.CreateInstance(__uuidof(Recordset));
       pCommand.CreateInstance(__uuidof(Command));

   (3) _ConnectionPtr pConnection;
       _RecordsetPtr  pRecordset;
       _CommandPtr    pCommand;

       pConnection.CreateInstance("ADODB.Connection");
       pRecordset.CreateInstance("ADODB.Recordset");
       pCommand.CreateInstance("ADODB.Command");

4、打开一个连接
  pConnection->Open(ConnectionString,"","",adModeUnknown);///连接数据库
 
  上面的连接字符串ConnectionString根据不同的数据源,分别对应不同的写法
  1)访问Access 2000
     "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassWord"

  2)访问ODBC数据
   "Provider=MADASQL;DSN=dsnName;UID=userName;PWD=userPassword;"
 
  3)访问Oracle数据库
    “Provider=MSDAORA;Data Sourse=serverName;User ID=userName;Password=userPassword;"

  3)访问MS SQL数据库
   "Provider=SQLOLEDB,Data Source=serverName;Initial Catalog=databaseName;User ID=userName;Password=userPassword;"

4、执行SQL命令
   SQL命令比较多,但是不去考虑细节,这里只说出通用的方法
   CString strSQL;//定义SQL命令串,用来保存SQL语句

   strSQL.Format("SQL statement");

   然后在每个要用到SQL命令串的方法中,使用strSQL.AllocSysString()的方法进行类型转换

5、com的专用数据类型
  
   variant ,bstr ,SafeArray
  
   variant变量的范围包括很多,使用_variant_t 进行管理
   bstr是一种字符串变量,使用_bstr_t进行管理
  
6、关闭连接
  
   if(m_pConnection->State)//不能多次关闭,否则会出现错误
           m_pConnection->Close();

7、结构化异常处理
   ADO封装了COM接口,所以需要进行错误处理
   如下例:
  HRESULT hr;
  try
  {
  hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
  if(SUCCEEDED(hr))
  {
  hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);///连接数据库
  ///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51;  }
  }
  catch(_com_error e)///捕捉异常
  {
  CString errormessage;
  errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
  AfxMessageBox(errormessage);///显示错误信息
  }


8、错误原因的分析
   (1)不支持接口,可能是不能插入空值

好了,希望大家可以跟我一起完善这篇总结!

   然后在每个要用到SQL命令串的方法中,使用strSQL.AllocSysString()的方法进行类型转换

5、com的专用数据类型
  
   variant ,bstr ,SafeArray
  
   variant变量的范围包括很多,使用_variant_t 进行管理
   bstr是一种字符串变量,使用_bstr_t进行管理
  
6、关闭连接
  
   if(m_pConnection->State)//不能多次关闭,否则会出现错误
           m_pConnection->Close();

7、结构化异常处理
   ADO封装了COM接口,所以需要进行错误处理
   如下例:
  HRESULT hr;
  try
  {
  hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
  if(SUCCEEDED(hr))
  {
  hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);///连接数据库
  ///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51;  }
  }
  catch(_com_error e)///捕捉异常
  {
  CString errormessage;
  errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
  AfxMessageBox(errormessage);///显示错误信息
  }


8、错误原因的分析
   (1)不支持接口,可能是不能插入空值

好了,希望大家可以跟我一起完善这篇总结!