一、ADO数据库连接分6步:
1.ADO对象的导入(#import 一个ADO动态链接库msado15.dll )
2.初始化COM对象(::CoInitialize(NULL);)
3.获取连接CreateInstance(连接到数据库)
4.打开连接的数据库open(必要的 用户名 和 密码)
5.获取字符集 RecordSet、处理数据
6.关闭数据集,关闭连接close
二、
1、导入库文件
#import "C:\Program Files\commonfiles\system\ado\msado15.dll" no_namespace rename("EOF","EndOfFile")rename("BOF","FirstOfFile")
使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下:
ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。
类型库描述了自治接口,以及C++使用的COM vtable接口。
当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,
并以此创建一组C++头文件。这些头文件具有.tli 和.tlh扩展名,#import引入ADO库文件的代码编译后,在项目的目录下生成了这两个文件。在C++程序代码中调用的ADO类要在这些文件中定义。
no_namespace指示ADO对象不使用名称空间,在有些应用程序中,
由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。
如果要使用名称空间,则可把第三行程序修改为: rename_namespace("AdoNS")。
rename("EOF","EndOfFile")表示将ADO中的EOF(文件结束)更名为adoEOF,因为文件的结尾也是以EOF结尾的,是为了避免与定义了自己的EOF的其他库冲突。 至于改为什么名字,可以根据自己的命名习惯自己确定。
2、初始化COM环境
OLE DB 是基于COM技术编写的,ADO是OLE DB基础之上的用户程序,
OLE DB是一个COM组件,在访问COM组件的时候需要初始化COM库,方法如下:
2.1 ::CoInitialize(NULL); //初始化OLE/COM库环境
释放代码:::CoUninitialize();//既然初始化了环境,当然一定要记得释放他了
2.2 也可以调用MFC全局函数初始化
AfxOleInit();
3、三大指针对象的定义和创建实例
3.1
_ConnectionPtr pConnection("ADODB.Connection");
_RecordsetPtr pRecordset("ADODB.Recordset");
_CommandPtr pCommand("ADODN.Command");
3.2
_ConnectionPtr pConnection;
_RecordsetPtr pRecordset;
_CommandPtr pCommand;
pConnection.CreateInstance(__uuidof(Connection));
pRecordset.CreateInstance(__uuidof(Recordset));
pCommand.CreateInstance(__uuidof(Command));
要产生一个智能指针对象,其实在定义的同时也可以初始化,如:
_ConnectionPtrpConnection(__uuidof(Connection));
_ConnectionPtr 是智能指针
__uuidof() 用来获取Connection全局唯一标识符
3.3
_ConnectionPtr pConnection;
_RecordsetPtr pRecordset;
_CommandPtr pCommand;
pConnection.CreateInstance("ADODB.Connection");
pRecordset.CreateInstance("ADODB.Recordset");
pCommand.CreateInstance("ADODB.Command");
4、打开一个连接
pConnection->ConnectionString = "这里的字符串有下面四种写法";//对连接字符串赋值
pConnection->Open(ConnectionString,"","",adModeUnknown);//连接数据库
//第二三个参数分别为用户的ID与密码,
因为在连接字符串ConnectionCstring中已经设置好了,这里可以为空。
第四个参数可以取下面两个参数:
adAsyncConnect
异步打开数据库,在ASP中直接用16
adConnectUnspecified
同步打开数据库,在ASP中直接用-1
ConnectionString根据不同的数据源,分别对应不同的写法
(要记下来很困难,可以在VB中利用ADO控件先连接好,再将其拷贝在VC中,这样不容易出错)
4.1 访问Access 2000
"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=databaseName;UserID=userName;Password=userPassWord"
4.2 访问ODBC数据
"Provider=MADASQL;DSN=dsnName;UID=userName;PWD=userPassword;"
4.3 访问Oracle数据库
“Provider=MSDAORA;DataSourse=serverName;User ID=userName;Password=userPassword;"
4.4 访问MS SQL数据库
"Provider=SQLOLEDB,DataSource=serverName;Initial Catalog=databaseName;UserID=userName;Password=userPassword;"
5、执行SQL命令,得到数据
方法1:
pRecordset =pConnection->Execute("Select * from authors",NULL,adCmdText);
方法2:
pRecordset ->Open("Select * fromauthors",_
variant_t((Idispacth*) pConnection), //设置活动连接
adOpenDynamtic,
//游标类型
adLockOptimistic,
//锁的类型
adCmdText);
方法3:
pCommand->put_ActiveConnection(_variant_t((Idispatch*) pConn);
pCommand->CommandText = "Select *from authors";
pRecordset =pCmd->Execute(NULL,NULL,adCmdText);
得到数据之后,做一个循环取得数据:
While (!pRecordset ->adoEOF)
{
Str =pRecordset->GetCollect("au_lname"));
pRst->MoveNext();
}
SQL命令比较多,但是不去考虑细节,这里只说出通用的方法
CString strSQL;//定义SQL命令串,用来保存SQL语句
strSQL.Format("SQL statement");
然后在每个要用到SQL命令串的方法中,使用strSQL.AllocSysString()的方法进行类型转换
6、com的专用数据类型
variant ,bstr ,SafeArray
variant变量的范围包括很多,它是一种变体类型,主要用于支持自动化的语言访问,
从而在VB中非常方便地使用,但是VC中比较复杂,它使用_variant_t 进行管理
bstr是一种字符串变量,使用_bstr_t进行管理,这个类重载了char *操作符
7、关闭连接
if(pConnection->State); //不能多次关闭,否则会出现错误
{
pConnection->Close(); //先判断状态,然后再关闭,其它类似
}
pRecordset->Close();
pCommand.Release();
pConnection.Release();
//释放引用计数
pRecordset.Release();
注意:调用Close()时用"->",调用Release()时要用".",为什么?
因为智能指针,_ConnectionPtr是一个重载了->运算符的类
_ConnectionPtr:它是一个接口指针模板。'.'是模板_com_ptr的函数。->是'接口函数'调用。
//forexample:
_ConnectionPtr m_Conn;
m_Conn.CreateInstance(....);//Createinterfaceinstance.
m_Conn->Open(...);//Openaconnectiontodatabase.
'->'是_com_ptr重载了的运算符.目的就是为了让你调用模板参数的函数.
8、结构化异常处理
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;DataSource=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);///显示错误信息
}
在ACCESS中使用日期比较
关于access中数据类型不匹配的问题between #1993-04-26# and #1993-05-26#
参考原文:https://blog.csdn.net/harvic880925/article/details/7674410