ado是硬盘上的表现形式是 一个名为msado15.dll的动态链接库。 第一步:在vs2010 中 创建一个对话框mfc程序。 第二步:在stdafx.h 添加一句代码 (添加位置是在#include afxdisp.h // mfc 自动化类 后面) #import c:\program files\common files\system\ado\
ado是硬盘上的表现形式是 一个名为 msado15.dll的动态链接库。
第一步:在vs2010 中 创建一个对话框mfc程序。
第二步:在stdafx.h 添加一句代码 (添加位置是在#include // mfc 自动化类 后面)
#import c:\program files\common files\system\ado\msado15.dll no_namespace rename(eof, endoffile)
下面解释一个上面代码的意思。
#import 这个没啥话说 就是引入的意思, c:\program files\common files\system\ado\msado15.dll 就是说一个全路径,就是msado15.dll
这个文件在硬盘中的位置。 如果你的系统没有做过刻意的更改 ,那么这个路径应该就是他了。
no_namespace , 这是啥意思? 翻译过来就是不使用命名空间 就是不使用 ado这个组件自己命名空间 不然你在后面使用ado的一些 接口的时候
就需要在前面加东西(加啥? 我也不知道 ,我也是停别人这么说的)
rename(eof, endoffile) 这句话 即使重命名 eof ,为啥要重新命名呢? 这是因为是在mfc里面有eof这个字眼 但是意思和ado里面的 eof不是
一个意思 所以需要重新命名 不然ado这货就疯了。 你可以任意命名 这要不和已有的 名字重复就好了 这个改名字为endoffile(有些哥们呢 喜欢命名为adoeof)
#import语句实际上相当于执行了api涵数loadtypelib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,clsid等进行声明,创建一系列包装方法。
××××××××××××××××××××××××××××××××××××转 ××××××××
好了第二步说完了 ,开始说第三步了。
第三步:如同世界上的其他组件库一样 使用前要初始化 使用后卸载(这句话是老师说的 谁能就此展开)
如何初始化呢。
在程序初始过程中需要初始化组件,一般可以用coinitialize(null);来实现,这种方法在结束时要关闭初始化的com,可以用下面语句couninitialize();来实现。在mfc中还可以采用另一种方法来实现初始化com,这种方法只需要一条语句便可以自动为我们实现初始化com和结束时关闭com的操作,语句如下所示:
afxoleinit()
为了让程序更完美 建议这样写
if(!afxoleinit())//这就是初始化com库
{
afxmessagebox(ole初始化出错!);
return false;
}
这个函数可以放置在theapp对象的初始化函数:initinstance()中。
ps:如果你不知道theapp的初始化函数 请 点击网页的右上角的x号 因为这篇文章不适合你
第四步:做这么多准备工作 终于可以可以说哦那个ado了。
首先看一看 ado的那些东西我我们可以使用。
ado包含一些顶层的对象:
连接(connection),代表到数据库的连接
记录集(recordset),代表数据库记录的一个集合
命令(command),代表一个sql命令
记录(record),代表数据的一个集合
流(stream),代表数据的顺序集合
错误(error),代表数据库访问中产生的意外
字段(field),代表一个数据库字段
参数(parameter),代表一个sql参数
属性(property),保存对象的信息
通常来说我用到了 前三个对象。其他东西我不熟。
第五步:在mfc的对话框程序创建三个对象 ,就是那三个智能指针的对象。
这个对象(其实是否可以称之为对象 我也不清楚 姑且称之吧)输入对话框类
下图是我创建的结果
第六步: 刚才那三个智能指针对象 被我创建出来了。
既然创建出来了 就可以用了。在哪里用呢?既然这三个对象属于对话框类,那么在对话框类的实例化对象中 就可以使用了。
注意以下内容是核心代码。
首先说一下核心代码的整体思路。
a:链接数据库 b:打开记录集 相当于用数据库里面的表给 记录集赋值 至此 表就存在于 内存中了
c:使用ado的相关函数 对记录集进行增删改查 d:关掉记录集 e:断开链接
至此完成一次轮回。
第七步: 建立和数据库的链接
打开数据库 也可以称之为 链接数据库
由于数据的操作带有很强的不确定性,所以对数据库的操作大都有错误抓取 就是 try catch
hresult hr;
try
{
//先创建连接实例
hr = m_pconnection.createinstance(__uuidof(connection));//创建connection对象
if (succeeded(hr))
{
m_pconnection->connectiontimeout=600;// 链接数据库时间限制
m_pconnection->commandtimeout=120;// 也许是sql语句执行时间限制
//然后打开数据库 open函数的参数是很有讲究的
//open 方法可打开一个到数据源的连接。当连接打开时,您可以对数据源执行命令
//一个包含有关连接的信息的字符串值。该字符串由一系列被分号隔开的 parameter=value 语句组成的。
//一个字符串值,包含建立连接时要使用的用户名称。
//一个字符串值,包含建立连接时要使用的密码。
//一个 connectoptionenum 值,确定应在建立连接之后(同步)还是应在建立连接之前(异步)返回本方法。
hr = m_pconnection->open(provider=microsoft.jet.oledb.4.0;data source=home.mdb,,,admodeunknown);//
//connectionstring 属性有 5 个参数:
//provider---》用于连接的提供者的名称。
//file name---》提供者特有的文件(例如,持久保留的数据源对象)的名称,这些文件中包含预置的连接信息。
//remote provider--》当打开客户端连接时使用的提供者的名称。(仅限于远程数据服务。)
//remote server--》当打开客户端连接时使用的服务器的路径名称。(仅限于远程数据服务。)
//url---》标识资源(比如文件或目录)的绝对 url。
//打开模式
/*
admodeunknown = 0,
admoderead = 1,
admodewrite = 2,
admodereadwrite = 3,
admodesharedenyread = 4,
admodesharedenywrite = 8,
admodeshareexclusive = 12,
admodesharedenynone = 16,
admoderecursive = 4194304
*/
}
}
catch(_com_error e)///捕捉异常
{
cstring errormessage;
errormessage.format(连接数据库失败!/r/n错误信息:%s,e.errormessage());
afxmessagebox(errormessage);///
}
afxmessagebox(成功打开数据库);
第八步:创建记录集
m_precordset.createinstance(__uuidof(recordset));
try
{
m_precordset->cursorlocation = aduseclient; //需要把数据传输给本地,应用举例是断开数据库进行recordset操作,即内存中操作
//而不是写入远端数据库。相反的有 aduseserver 是指直接在数据库中操作。
m_precordset->open(select * from jianghu,//sql 语句
m_pconnection.getinterfaceptr(),
adopendynamic,//游标类型
adlockoptimistic,//乐观锁
adcmdtext);//命令类型
/*
当您首次打开一个 recordset 时,当前记录指针将指向第一个记录,同时 bof 和 eof 属性为 false。如果没有记录,bof 和 eof 属性为 true
*/
}
catch(_com_error *e)
{
afxmessagebox(e->errormessage());
}
m_mydatagrid.putref_datasource(m_precordset);//将对象和datagrid控件链接在一起的函数。 在vc6 是 setrefdatasource
afxmessagebox(成功打开记录集);
第九步:给表增加行
// 数据库操作之:增
//特别需要游标的位置 和 数据库主键不可以重复 不然报错
//第一步:定义四个字符串 用于获取 edit控件中数据
cstring id =2;
cstring name =风清;
cstring xingbie =男;
cstring zhaoshu =独孤九剑;
m_cedit_id.getwindowtexta(id);//获取编辑框文本,记录在sztext变量中
m_cedit_name.getwindowtexta(name);
m_cedit_xingbie.getwindowtexta(xingbie);
m_cedit_zhaoshu.getwindowtexta(zhaoshu);
//第二步:正是开始库的操作
try
{
//a :选择游标位置
m_precordset->movefirst();//新建的数据会添加到datagrid的最后一条 但在数据库里面是第一条。
//b:提醒系统我要增肌数据了
m_precordset->addnew();
//c: 调用函数putcollect 修改数据
m_precordset->putcollect(id,_variant_t(id));
m_precordset->putcollect(namegsz,_variant_t(name));
m_precordset->putcollect(xinbie,_variant_t(xingbie));
m_precordset->putcollect(zhaoshu,_variant_t(zhaoshu));
//d: 更新数据库 也可以理解为写入数据库
m_precordset->update();
}
catch (_com_error e)
{
afxmessagebox(增加数据库失败!);///显示错误信息
}
afxmessagebox(增加数据库成功);
未完待续