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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 路人甲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)不支持接口,可能是不能插入空值

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