VC++下使用ADO访问Access数据库完整篇
用ADO对象访问Access数据库的方法
ASP与网络数据库学习报告学院:专业:姓名:学号:成绩:二0一 0 年十一月用ADO对象访问Access数据库的方法ADO称为“Active数据对象”,是基于组件的数据库编程接口。
ADO实际是一种提供访问各种数据类型的连接机制,是一个与编程语言无关的COM(Component Object Model)组件系统。
ADO设计为一种极简单的格式,可以方便地连接任何符合ODBC标准的数据库。
在数据库的应用中,使用ADO编写的应用程序可以存取Internet任何地方的数据。
而我们通常用ADO的Connection对象、Command对象、Recordset对象来创建数据库。
而Acesss 数据库是目前应用比较广泛的桌面型数据库,广泛应用于各种小型管理信息系统中。
现在我们就来创建一个“网上留言”数据库以详细理解用ADO对象访问Access数据库的方法。
一、创建背景随着internet在中国的迅速发展,人们日常生活中越来越多地使用新技术来为自己的工作和学习服务。
在众多Internet关联功能中,有一项新的业务正成为所有用户所津津乐道的交流方式,这就是网上留言。
根据调查现在网民使用现状,网上留言板的使用百分比居前列。
二、数据库设计:1.首先创建一个Access 2003数据库为onlineword.mdb,分别设计以下两个表:reply表:字段名意义字段类型reid 回复者信息主键数字reply 回复者留言内容文字retime 留言时间日期leave表:字段名意义字段类型Id 留言者信息主键数字name 留言者姓名文字sex 性别文字ip ip地址数字os 操作系统文字qq qq号数字mail 邮箱地址数字addtime 添加时间日期body 留言内容文字ie ie类型文字2.建一个文件conn.asp用于链接打开当前目录下的onlineword.mdb数据库。
代码如下:<% set conn=server.createobject("ADODB.Connection")Conn.open"Provider=Mcorosoft.jet.oledb.4.0;Data Source="& server.MapPath("onlineword.mdb")%>3.用connection对象在数据库的reply表中添加一条记录(插入语句),建一个文件:insert.asp代码如下:<!--include file="conn.asp"--><% sql1="insert into reply( reid,reply,retime) values(‘1’,’谢;谢’,’10/11/12’)"conn.execute.sql1conn.closeset.conn=nothing%>4.用对象显示表中记录,在当前目录下,建一个show.asp文件,代码如下:<!--include file="conn.asp"--><% set rec=server.CreateObject("ADODB.RecordSet")Sql2="select * from reply where reid="& rs("id")' & " order by reid desc"rec.open sql2,conn,1,1%><table width="100%"><% do while not rec.eof %><tr><td><%=rs(reid) %></td></tr><tr><td><%=rs(reply) %></td></tr><tr><td><%=rs(retime) %></td></tr><% rec.movenextwendrec.closeset rec=nothing%></table>三、其他操作打开管理员回复信息数据库,开始调用其中内容。
VC中ADO操作Access数据库的实现
VC中ADO操作Access数据库的实现
陈祖义;陶忠刚
【期刊名称】《计算机光盘软件与应用》
【年(卷),期】2010(000)010
【摘要】本文简要介绍了在VC6.0中使用ADO操作Access数据库的基本步骤和程序代码的实现,并列举出了关键的实例代码.
【总页数】1页(P150)
【作者】陈祖义;陶忠刚
【作者单位】空军第一航空学院,河南信阳,464000;空军第一航空学院,河南信阳,464000
【正文语种】中文
【中图分类】TP311.56
【相关文献】
1.在VC++中使用ADO方式对ACCESS数据库进行操作 [J], 范晶
2.在VC#.NET中利用实现树视图浏览编辑数据库 [J], 钟卫东
3.在VC中利用ADO技术操作数据库中的BLOB数据 [J], 王井阳;张晓明;秦敏;杨奎河;王晓红
4.在 VB6.0中通过宏操作实现文本文件到Access数据库的导入 [J], 吴恒亮
5.ADO数据库技术及微机线路保护通信规约在上位机开发中的VC++实现 [J], 刘小斌;杨年兴;马军弟;王艳玲;李梦达
因版权原因,仅展示原文概要,查看原文内容请购买。
ADO对象操作Access数据库关键技术
批量处理数据:将多个操作合并为一个 事务,减少数据库操作的次数和时间
使用索引:为经常查询的字段建立索引, 提高查询效率
优化数据库设计:合理设计数据库结构, 减少数据冗余和复杂度
错误处理策略建议
捕获异常:使用Tr y...Catch语句捕获异常,确保程序正常运行 错误日志记录:记录错误信息,方便后续排查和解决问题 错误提示:提供友好的错误提示信息,帮助用户快速定位问题 避免重复操作:在发生错误后,避免重复执行可能导致错误的操作
ADO对象操作 Access数据库关键 技术
单击此处添加副标题
汇报人:
目录
添加目录项标题
ADO对象操作Access数据 库
示例代码展示
ADO对象概述 关键技术解析 注意事项与最佳实践
01
添加章节标题
02
ADO对象概述
ADO对象定义
ADO(ActiveX Data Objects):是一种用于访问数据库的对象模型 ADO是基于COM(组件对象模型)的,因此可以在各种编程语言中使用 ADO提供了与数据库交互的接口,可以执行SQL语句、读取数据等操作 ADO对象包括Connection、Recordset、Command等,用于与数据库进行交互
ADO对象模型
ADO对象模型
ADO对象的主 要组件
ADO对象的主 要方法
ADO对象的主 要属性
ADO对象与数据库连接
ADO对象与数据库连接 ADO对象的主要组件 ADO对象的使用方法 ADO对象与数据库的交互过程
03
ADO对象操作 Access数据库
建立数据库连接
使用ADO对象操 作Access数据库 需要先建立数据 库连接
获取结果集示例
VC+ADO+ACCESS登陆界面实现
and
m_ado.ExitConnect(); }
2.12 将数据库文件放置到 VC 程序目录下
{ e.Description(); } return m_pRecordset; }
2.6 插入一个新的对话框资源
ID:IDC_EDIT_UID ID:IDC_EDIT_PWD
ID:IDOK
ID:IDCANCEL
2.7 为登陆对话框新增一个 CLOGIN 类,选中 ResourceView 中的“IDD_LOGIN”->菜单栏 “View->ClassWizard...” ,在弹出的对话框中选择“Create a new Class”,单击“OK” ,在弹出 的对话框输入“CLOGIN”类名
void CAdo::ExitConnect() { if(m_pRecordset != NULL) { m_pRecordset->Close(); } if(m_pConnection != NULL) { m_pConnection->Close(); }
} void CAdo::Execute(_bstr_t strSQL) { try { if(m_pConnection == NULL) { OnInitADO(); } m_pConnection->Execute(strSQL,NULL,adCmdText); } catch(_com_error e) { e.Description(); } } _RecordsetPtr& CAdo::GetRecordset(_bstr_t strSQL) { try { if(m_pConnection == NULL) { OnInitADO(); } m_pRecordset.CreateInstance(__uuidof(Recordset)); m_pRecordset->Open(strSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOpti mistic,adCmdText); } catch(_com_error e)
Visual C++环境下ADO控件访问access数据库
Visual C++环境下ADO控件访问数据库DBGrid数据表格控件以其短小精悍而深受大家的喜爱,但其如何在Visual C++中使用却很少有文章提及,本文将VC下使用DBGrid的具体步骤简要地介绍给大家。
一.前期准备为了实现DBGrid控件的自动捆绑,我们需要建立一个数据库和与之关联的数据源,本例中我们用Access建立数据库mydata.mdb,在数据库中新建一张表users,包含三个字段username,address,email,并输入多条记录。
在控制面板ODBC数据源中建立名称为test的系统DSN(注意是系统DNS非用户DNS),并将其指向mydata.mdb二.创建工程新建一个基于对话框的MFC AppWizard (exe)工程,取名为GridTest,并在AppWizard的第2步中确认已经提供ActiveX控件支持。
三.插入控件我们需要插入Microsoft RemoteData Control与DBGrid Control两个控件,方法如下:1)选择菜单->Project->Add to Project->Components and Controls Gallery2)在部件选择对话框中进入Registered ActiveX Controls3)选择Microsoft RemoteData Control ,单击Insert按钮,确认后对类进行配置(可以按默认),我们不做任何修改单击OK按钮,插入完成。
以同样的步骤,插入DBGrid Control控件。
4)回到VC工作区,我们在ResourceView中选择GridTest对话框模板(即ID号为IDD_GRIDTEST_DIALOG的对话框模板)此时我们发现在Controls工具条中已经新增了两个按钮,分别表示刚才插入的两个控件。
5)现在我们在模板中画出这两个控件,如图所示:四.更改控件属性鼠标右键单击RemoteData Control控件,在右键菜单中选择Properties,弹出属性对话框,在Control选项卡中选择数据源test,在SQL中输入SQL语句例如:select * from users如下图所示:用同样的方法我们打开DBGrid控件的属性对话框。
VC 使用ADO连接数据库
一、ADO概述ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。
ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问和操作数据库服务器中的数据。
ADO 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。
ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。
之所以称为 ADO,是用了一个比较熟悉的暗喻,OLE 自动化接口。
OLE DB是一组”组件对象模型”(COM) 接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。
OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。
OLE DB 为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。
也就是说,OLE DB 并不局限于 ISAM、Jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。
在实际应用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如 Microsoft Exchange 中的数据。
但是,OLE DB 应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。
您需要的API 应该是一座连接应用程序和OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。
二、在VC中使用ADO(开发步骤如下:)1、引入ADO库文件使用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。
代码如下所示://用#import引入ADO库文件#import "c:\program files\common files\system\ado\msado15.dll" \no_namespaces \rename("EOF" adoEOF")这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。
使用ADO操作Access数据库
使用ADO操作Access数据库ADO对象1、Access内嵌的VBA是用ADO技术开发数据库应用的主要工具,ADO是目前Microsoft通用的数据访问技术;2、ADO对象模型包括:Connection、Recordset、Record、Command、Parameter、Field、Property、Stream、Error九个对象;3、主要的ADO对象介绍:1)Connection对象:ADO对象模型中的最高级对象,用来实现应用程序与数据源的连接;2)Command对象:主要在VBA中使用SQL语句访问、查询和修改数据库中的数据,实现Recordset对象无法实现的操作(数据表级别的操作),可以使用DoCmd代替;3)Recordset对象:ADO最为常用的、重要的对象,可以访问表和查询对象,返回的记录储存在Recorderset对象中,主要执行的操作:①查询数据表中的数据;②在数据表中添加数据;③更新数据表中的数据;④删除数据表中的特定数据;在Access中引用ADO对象1、Access引用ADO的步骤:①声明、初始化Connection对象;②创建Recordset对象,编程完成各种操作;③关闭ADO对象;2、声明、初始化Connection对象'声明Connection对象:一般使用cn做为变量的命名前缀;Dim coName As ADODB.Connection'初始化Connection对象,连接当前数据库;Set cnName = CurrentProject.Connection3、声明和打开Recordset对象1)声明、初始化Recordset对象Dim rsName As ADODB.Recoresetset rsName = new ADODB.Recordset2)打开一个Recordset对象使用Recordset的Open方法可以打开数据表、查询对象、或直接引用SQL查询语句4、关闭Recordset和Connection对象rsName.ClosecnName.CloseSet rsName = NothingSet cnName = Nothing通过Recordset对象引用记录字段1、引用字段的方法有2种:直接在记录集对象中引用字段名称;使用记录集对象的Fields(n)属性引用;Code = rsName!字段名'引用该字段的第一条记录Code = rsName.Field(n)'引用该字段的第n条记录,n从0开始,可以用循环输出需要量的记录2、如果记录集字段包含空格、或者是一个保留字,则引用时必须将该字段用[ ]括起来;通过Recordset对象浏览记录1.Recordset记录集对象提供了4种方法浏览记录2、BOF、EOF属性分别记录指针是否在文件开始、文件末尾;如果记录集指针指向某记录时,BOF和EOF都为false;'添加一个窗体部件的按钮事件:浏览下一条记录Priavte Sub ComomndNext_Click()rsDemo.MoveNextIf rsDemo。
VC与ADO数据库操作1
VC与ADO数据库操作学研部的同志们,大家好! 想开一次学习会,实习时间冲突了,只好把文档发给大家看了。
重点推荐李振龙的BMP读图教程! 尤其是大三GIS班的同志,注意了,可能实习用得上的!一、ADO简介ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,请不必为此担心,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API、DAO都要容易使用,【1】为工程做准备建一个基于对话框的工程,名字叫PlaceName。
加入一个ListControl控件,ID改成IDC_RESULT,顺便点一下Styles选项卡,把View改成Report,你可以看到对话框里的ListControl控件的样子已经变成带字段名的报表格式了。
右击它,用ClassWizard添加成员变量,名字为m_LisCtrlResult。
按照上面的程序界面,加入一个编辑框(输入SQL语句用的),同上面添加m_LisCtrlResult 成员变量一样,加入一个CString变量,名字为m_SqlText,还有一个“查询”按钮,把它叫为Query,双击它一下,VC会自动为它加入消息和函数的,名字也叫OnQuery(),等一下我们就用着那个函数的。
看到我们SpaceSoft的标志不?把你的照片换成BMP格式的,放上去吧!定义一下要用着的变量:class CPlaceNameDlg : public CDialog{// Constructionpublic:_RecordsetPtr m_pRecordset; //定义一个RecordsetPtr对象,用来储存读出来的表HRESULT hr; //查出后的表Fields* fields; //储存查出后的字段BSTR bstrColName; //储存一下字段名long nRstCol; //SQL语句一共查出了几个字段?nRstCol个!CString strColName[100]; //把查出的字段名转换成常见常用的CString类型,放在这个数组里边……}//储存从数据库读出的数据,variant 变量能够存储所有系统定义类型的数据。
VC++使用ADO开发ACCESS数据库
VC++使用ADO开发ACCESS数据库VC++使用ADO开发ACCESS数据库本文通过实例演示如何在VC++中使用ADO进行ACCESS数据库编程,并对涉及到的几个概念进行详细解释。
本文不对ADO和ACCESS的基本概念进行详细解释,主要包括以下内容:第一部分 ADO和ADOX到底是什么,二者的作用和区别建立数据库第二部分 ADOX创建ACCESS数据库第三部分ADO创建ACCESS数据库的表第四部分使用_ConnectionPtr接口开发ACCESS数据库第五部分使用_RecordsetPtr接口开发ACCESS数据库第一部分ADO和ADOX到底是什么,二者的作用和区别ADO是Microsoft 最新推出的数据库访问的高层软件接口。
它和Microsoft 以前的数据库访问接口DAO、RDO相比具有更大的灵活性,使用也更方便,开发效率大为提高。
ADOX是核心ADO对象的扩展库。
它提供的附加对象可用于创建、修改和删除模式对象,如表和过程。
要使用ADOX,则应建立对ADOX类型库的引用。
ADOX 库文件名为 Msadox.dll。
通俗地讲,ADO是访问数据库的一种接口,可以使用它方便地进行数据库编程。
而ADOX是微软对ADO功能的扩展,比如:可以ADOX创建数据库(而ADO 没有创建数据库的功能)。
第二部分ADOX创建ACCESS数据库用ADOX创建access数据库方法很简单,只需要创建一个Catalog对象,然后调用它的Create方法就可以了。
例程ADOXCreateDatabase演示如何使用ADOX创建一个ACCESS数据库。
打开VC++ 6.0,新建一个基于对话框的工程ADOXCreateDatabase。
在对话框IDD_ADOXCREATEDATABASE_DIALOG中添加一个编辑框IDC_DBNAME和一个按钮IDC_BTN_CREATE,编辑框用以输入数据库名称。
使用ClassWizard给编辑框创建一个CString变量m_dbName。
VC++中使用ADO方式操作ACCESS数据库
VC++中使用ADO方式操作ACCESS数据库ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API、DAO、RDO都要容易使用,并不失灵活性。
本文详细地介绍在Visual C++开发环境下如何使用ADO来进行数据库应用程序开发,并给出示例代码。
为了使读者朋友都能测试本例提供的代码,我们采用Access数据库,您可以直接在我们提供的示例代码中找到这个test.mdb。
程序编译运行后的效果如图一所示:图一、ADO操作ACESS数据库的界面效果图一、实现方法万事开头难,任何一种新技术对于初学者来说最重要的还是"入门",掌握其要点。
让我们来看看ADO 数据库开发的基本流程吧!它的基本步骤如下:(1)初始化COM库,引入ADO库定义文件(2)用Connection对象连接数据库(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。
(4)使用完毕后关闭连接释放对象。
下面我们将详细介绍上述步骤并给出相关代码。
1、COM库的初始化我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完成,请看如下代码:BOOL CADOTest1App::InitInstance(){AfxOleInit();......}2、用#import指令引入ADO类型库为了引入ADO类型库,需要在项目的stdafx.h文件中加入如下语句:#import "c:program filescommon filessystemadomsado15.dll"no_namespace rename("EOF","adoEOF")这一语句有何作用呢?其最终作用同我们已经十分熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库。
VC中ADO操作Access数据库的实现
软件设计开发
C m u e D S fw r n p l c t o s op t r C o t a e a d A p a i n i 21 0 0年第 1 O期
V C中 A O操作 Aces D cs 数据库的实现
陈祖 义 , 陶忠 刚
( 空军第一航 空学院,河南信 阳
…
一
~
麓
…
…
…
一
黜_
…
I
0 一
图 1 基 金 利润 自动 计算 系统 主界面 建 立数 据 库和 数据 表 在 本例 中建 立 了 fn u d数据 库 ,在 数据 库 中建立 了 fn 数 据 ud 表 ,表 中共 有 fn o ( 金代 码 ) fn— al ( 金 名 称 ) u dn 基 、 u dnn 基 e 、 fn at a ( u dp s dy 基金 购 买时 间 )等 l 个 字段 。 2 二 、 引入 A O 定 义文 件 D库 引入AO D 库定 义文 件 的方 法是 在 sd f. 头 文件 中使 用预 处 ta xh 理 指令 ,代 码如 下 :
)
五 、通 过 Rc r st 象 取得 结果 记 录集 进行 操作 eo d e 对 通 过 R cr st对 象对 结果 记 录集 进行 操作 ,需要 打开 数据 e od e 库 中 的 数 据 表 。 操 作 可 以 放 在 对 话 框 的 初 始 化 函 数 O I iDa o 0中完成 ,代 码 如下 : n n t ilg
a l .d n do 5 l1 o
_ 一
e n t n e( u i o (o n c i n ): Isa c u d fC ne t o)
VC基于ADO技术访问Access数据库
1引 言
在 开 发 数 据 库 应 用软 件 中 , v u a 1 c+ +提 供 了 多种 访 问
模型 , 并加 以改进 , 包含了较少的对象、 更多的属性方法 ( 和参 数) 和事件。A DO有 7 个对象 : Co mma n d 对象 、 Co ne c t i o n 对
连 接 。利 用 C o m ma n d对 象和 1 L e c o r se d t 对 象都 可 在 执 行 数 据
关系型数据库。由于它
单、
易用的特点 , 因而已成为当前数据库开发的主流旧。
库 操 作 后 返 回 一 个 记 录 集 。和 Co n n e c i t o n对 象 一 样 ,
据库的简单快捷操作 , 而 Re c o r d s e t 对象可以提供更多的数据
库 操 作控 制 功 能 , 如 记录 锁 定 , 游 标 控 制 等f 3 1 。
2 . 2 AD O编 程环境 初始化
使用 A DO访问数 据库之前有 2 个准备步骤 。
( 1 ) 导入 A DO 类型 库
冲突 。 ( 2 ) 初始化 C OM 库 因为 A DO 库 是 一 个 C OM 动 态 链 接 库 ,所 以 使 用 A DO
m
_
p C o n- > C l o s e 0 ; / / 关 闭连 接
m p C o n. P . e l e a s e 0 ; / / 释放组件接 口
D O 对象 。关闭连接的代码如下 : 根据 Wi n d o w s 操作系统版本的不 同 , 动态链接库文件 可 个 连接 的 A 能是 ms a d o l 0 . d 1 1 、 ms a d o 1 5 . d l 1 或 ms a d o 2 0 m ,需 根据实际 情况 进行修改。 n o _ n a me s p a c e 的意 是该应用程序中 , A DO对象的 命名不存在和其他对象冲突 的情况 , 不使 用命 名空间 , 重命名 E OF和 B OF是为 了避免与其他库 中的已定义 的 E OF和 B OF
0003 C#使用ADO直接访问Access数据库中表
1.C#使用ADO直接访问Access数据库中表数据库连接字符串为:OleDbConnection _oleDbConnection = newOleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_databaseName);程序示例:///<summary>///根据名称选择Oracle数据库中的表对象,并向Geodatabase同名表对象中添加数据,方便进度条功能的实现///</summary>///<param name="tableName">表名称</param>public void LoadTable2Geodatabase(string tableName){ClassDatabaseConfig _databaseConfig = new ClassDatabaseConfig();_databaseConfig.XMLFileName = m_xmlFileName;_databaseConfig.ReadDatabaseConfig();ClassTablespace _tablespace = _databaseConfig.ConnectedTablespace;ClassTable _table = _tablespace.GetTableByName(tableName);OleDbConnection _oleDbConnection = newOleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_databaseName);OracleConnection _connection = new OracleConnection(m_connectionString);try{_oleDbConnection.Open();_connection.Open();}catch (Exception ex){DevComponents.DotNetBar.MessageBoxEx.Show(ex.Message,"错误",MessageBoxButtons.OK,MessageBoxIcon.Error);}int _rowCount = 0;string _selectSQL = "Select * from hsuser." + tableName;OracleCommand _selectCommand = new OracleCommand(_selectSQL, _connection);OracleDataReader _dataReader = _selectCommand.ExecuteReader();string _insertValue = "";while (_dataReader.Read() == true){for (int i = 0; i < _table.Columns.Count; i++){string _value = _dataReader.GetOracleValue(i).ToString();_insertValue = _insertValue + "'" + _value + "',";}_insertValue = _insertValue.Substring(0, _insertValue.Length - 1);string _insertSQL = "Insert into " + tableName + " values(" + _insertValue + ")";OleDbCommand_insertCommand = new OleDbCommand(_insertSQL, _oleDbConnection);try{_insertCommand.ExecuteNonQuery();_rowCount++;_insertValue = "";}catch (Exception ex){DevComponents.DotNetBar.MessageBoxEx.Show(ex.Message,"错误",MessageBoxButtons.OK,MessageBoxIcon.Error);//MessageBox.Show(ex.Message);}}_oleDbConnection.Close();_connection.Close();m_lableProgress = "成功向表 " + tableName + " 中添加记录 " + _rowCount.ToString() + " 条";}2、使用ArcEngine里面的ITable向表格中添加行的时候,需要注意,当表没有OID(唯一标识符)字段时,会出现错误问题描述:在File Geodatabase中新建了一个表格,现在要往里面写数据。
VC++中使用ADO方式操作ACCESS数据库
VC++中使用ADO方式操作ACCESS数据库用SQL创建数据库首先说说怎么用SQL语句创建数据库,创建数据库的语句有如下几种:1. CREATE TABLE(创建新表)2. CREATE INDEX(增加索引)3. DROP INDEX(删除索引)4. CONSTRAINT(约束语句)5. ALTER TABLE(修改表)6. DROP TABLE(删除表)CREATE TABLE语句:在数据库中生成新表,表中字段的类型可以为:INTEGER(整型)、LONG(长整型)、SINGLE (单精度浮点数)、DOUBLE(双精度浮点数)、DA TETIME(日期型,也可以写成DA TE)、BIT(布尔型)、TEXT(字符串型,最大255个字节)、MEMO(字符串型,最大可达1.2G 字节)、COUNTER(自动递增长整型,可确定记录的唯一性)、CURRENCY(货币型,精确到小数点左边15位,右边4位)、BINARY(字节型,最大255个)、LONGBINARY(用于OLE 对象)、GUID(全局唯一标识符)。
生成表NewTable,该表有文本字段Field1和整型字段Field2,表名和字段名可以随便你取,不区分大小写,但是,有些保留字不能用作表名字段名,比如NumberCREATE TABLE NewTable (Field1 INTEGER ,Field2 TEXT);CREATE [ UNIQUE ] INDEX indexON table (field [ASC|DESC][, field [ASC|DESC], ...])[WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]CREATE INDEX 语句说明:index:要创建的索引的名称。
table:将包含索引的现有表的名称。
field :要进行索引的字段的名称。
若要创建单字段索引,请在表名后的括号中列出字段名。
VC之ADO访问ACCESS数据库
1.引入ADO类#import "c:\program files\common files\system\ado\msado15.dll" \no_namespace \rename ("EOF", "adoEOF")2.在资源视图里面添加按钮(如图,并设置相应的ID)及其他资源:方法:打开Dialog对话框IDD_XPDLG_DIALOG 并加入一个Button,双击这个Button,生成该按钮单击处理函数。
3.编辑CMyAccessApp类:A.在CMyAccessApp类里面初始化COMAfxOleInit();m_pConnection.CreateInstance(__uuidof(Connection));在ADO操作中建议语句中要常用try...catch()来捕获错误信息try{// 打开本地Access库db1.mdbm_pConnection->ConnectionTimeout =5;m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=db1.mdb","","",adModeUnknown);}catch(_com_error e){AfxMessageBox(TEXT("数据库连接失败,确认数据库db1.mdb是否在当前路径下!"));////VS2005编译器只能写成AfxMessageBox(_T("test"));才能使用return FALSE;}(其中我的数据库的表名是dbtable,数据库是db1)附:常用的数据库连接方法:(1)通过JET数据库引擎对ACCESS2000数据库的连接m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:\\test.mdb","","",adModeUnknown);(2)通过DSN数据源对任何支持ODBC的数据库进行连接:m_pConnection->Open("Data Source=adotest;UID=sa;PWD=;","","",adModeUnknown);(3)不通过DSN对SQL SERVER数据库进行连接:m_pConnection->Open("driver={SQLServer};Server=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown);其中其中Server是SQL服务器的名称,DATABASE是库的名称B.使用vc2005自带的重写函数ExitInstance(){// 关闭ADO连接状态if(m_pConnection->State)m_pConnection->Close();m_pConnection= NULL;}4.在CMyAccessDlg类里面编辑():A.#import 包含后就可以用3个智能指针了:_ConnectionPtr、_RecordsetPtr和_CommandPtr 定义ADO连接、命令、记录集变量指针_ConnectionPtr m_pConnection;_CommandPtr m_pCommand;_RecordsetPtr m_pRecordset;添加用于相应相应资源的变量:CListBox m_AccessList;CString m_Name;CString m_Age;在DoDataExchange中添加代码处理消息:DDX_Control(pDX, IDOK, m_OK);DDX_Control(pDX, IDC_WRITEACCESS, m_Write);DDX_Control(pDX, IDC_READACCESS, m_Read);DDX_Control(pDX, IDC_MODIFY, m_Modify);DDX_Control(pDX, IDC_DELETE, m_Delete);DDX_Control(pDX, IDC_ABOUT, m_About);DDX_Control(pDX, IDC_LISTACCESS, m_AccessList);DDX_Text(pDX, IDC_NAME, m_Name);//bian ji kuang Name de ID wei IDC_NAMEDDV_MaxChars(pDX, m_Name, 10);//Name de ge shiDDX_Text(pDX, IDC_AGE, m_Age);bian ji kuang Age de ID wei IDC_AGEDDV_MaxChars(pDX, m_Age, 3);//Age de ge shi在BEGIN_MESSAGE_MAP(CMyAccessDlg, CDialog)下面添加列表框处理函数ON_LBN_SELCHANGE(IDC_LISTACCESS, OnSelchangeListaccess)(以下为数据库的操作——---——)(1).打开一个记录集:首先创建一个_RecordsetPtr实例,然后调用Open()得到一条SQL语句的执行结果//使用ADO创建数据库记录集m_pRecordset.CreateInstance(__uuidof(Recordset));// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,try{m_pRecordset->Open("SELECT * FROM dbtable", // 查询DemoTable表中所有字段theApp.m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针adOpenDynamic,adLockOptimistic,adCmdText);}catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}(2).编辑Read按钮对应的函数{_variant_t var;CString strName,strAge;// 清空列表框m_AccessList.ResetContent();strName=strAge="";// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,try{if(!m_pRecordset->BOF)m_pRecordset->MoveFirst();else{AfxMessageBox(TEXT("表内数据为空"));return;}// 读入库中各字段并加入列表框中while(!m_pRecordset->adoEOF){var = m_pRecordset->GetCollect("Name");if(var.vt != VT_NULL)strName = (LPCSTR)_bstr_t(var);var = m_pRecordset->GetCollect("Age");if(var.vt != VT_NULL)strAge = (LPCSTR)_bstr_t(var);m_AccessList.AddString( strName + " --> "+strAge );m_pRecordset->MoveNext();}// 默认列表指向第一项,同时移动记录指针并显示m_AccessList.SetCurSel(0); OnSelchangeListaccess();//列表框处理函数}catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}(3).插入按钮对应函数编辑:{UpdateData();if(m_Name == "" || m_Age == ""){AfxMessageBox(_T("姓名和年龄信息不能为空!")); return;}try{// 写入各字段值m_pRecordset->AddNew();m_pRecordset->PutCollect("Name", _variant_t(m_Name)); USES_CONVERSION;m_pRecordset->PutCollect("Age", atol(T2A(m_Age)));m_pRecordset->Update();AfxMessageBox(TEXT("插入成功!"));// 更新显示其库内容int nCurSel = m_AccessList.GetCurSel(); OnBnClickedReadaccess();m_AccessList.SetCurSel(nCurSel);// 移动记录指针到新的位置OnSelchangeListaccess();}catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}}(4).删除按钮对应函数编辑:{if(m_AccessList.GetCount() == 0)return;else if(m_AccessList.GetCurSel() < 0 || m_AccessList.GetCurSel() >m_AccessList.GetCount())m_AccessList.SetCurSel(0);try{// 删除当前行记录m_pRecordset->Delete(adAffectCurrent);m_pRecordset->Update();// 删除列表中当前值int nCurSel = m_AccessList.GetCurSel();m_AccessList.DeleteString(nCurSel);if(nCurSel == 0 && (m_AccessList.GetCount() != 0))m_AccessList.SetCurSel(nCurSel);else if(m_AccessList.GetCount() != 0)m_AccessList.SetCurSel(nCurSel-1);// 移动记录指针到新的位置OnSelchangeListaccess();}catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}}(5).修改按钮对应函数编辑{UpdateData(); // 更新对话框数据if(m_AccessList.GetCount() == 0 || m_Name == "" || m_Age == "") {AfxMessageBox(_T("表中记录数为空或姓名和年龄信息没有设置!"));return;}else if(m_AccessList.GetCurSel() < 0 || m_AccessList.GetCurSel() >m_AccessList.GetCount())m_AccessList.SetCurSel(0);// 修改当前记录的字段值try{m_pRecordset->PutCollect("Name", _variant_t(m_Name));//cannot convert parameter 1 from 'CString' to 'const char *'//程序运行在Unicode模式下,解决CString convert to const char* 方法USES_CONVERSION;m_pRecordset->PutCollect("Age", atol(T2A(m_Age)));//m_pRecordset->PutCollect("Age", atol(m_Age));m_pRecordset->Update();// 重新读入库记录更新显示int nCurSel = m_AccessList.GetCurSel();OnBnClickedReadaccess();m_AccessList.SetCurSel(nCurSel);// 移动记录指针到新的位置OnSelchangeListaccess();}catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}}(6).当每次选择新的记录时,都会移动指针到新的记录位置并将值显示出来用到OnSelchangeListaccess()函数,要自己建的{int curSel = m_AccessList.GetCurSel();_variant_t var,varIndex;if(curSel < 0) return;try{// 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针m_pRecordset->MoveFirst();m_pRecordset->Move(long(curSel));var = m_pRecordset->GetCollect("Name");if(var.vt != VT_NULL)m_Name = (LPCSTR)_bstr_t(var);var = m_pRecordset->GetCollect("Age");if(var.vt != VT_NULL)m_Age = (LPCSTR)_bstr_t(var);UpdateData(false);}catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}}(7).如果要实现XP风格按钮可以看一下这个网页:/?action-viewnews-itemid-6260925.好了,编译运行一下喔,就可以看到效果了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++下使用ADO访问Access数据库完整篇2009年10月18 | 分类: 编程开发 | 3 条评论 | 标签: Visual Studio这次先整理一下ADO的全套流程方便有类似需求的网友参考。
实际上,根据天缘的经验,接口类编程只需要遵守人家的约定就可以了,很多做软件的网友也都是忙的很,没有时间一一深究。
1、在StdAfx.h中引入ADO类支持方法是在StdAfx.h中增加下面两句话:#include <comdef.h>//如果需要则添加本句#import "c:\program files\common files\system\ado\msado15.dll"no_namespace rename ("EOF", "adoEOF")2、初始化COM环境在MFC中可以用AfxOleInit()或CoInitialize(NULL),该函数一般放在InitInstance()历程里。
非MFC使用用CoInitialize(NULL)。
卸载COM环境使用CoUnInitialize(),一般放在主程序的析构函数里。
这样我们就会三个指针可用:_ConnectionPtr、_RecordsetPtr和_CommandPtr,分别代表:_ConnectionPtr接口返回一个记录集或一个空指针,通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,对于要返回记录的操作通常使用_RecordserPtr来实现。
而用 _ConnectionPtr操作时要想得到记录条数得遍历所有记录,用_RecordserPtr则不需要。
_RecordsetPtr指针是一个记录集对象。
可以对记录集提供了更多的控制功能。
它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给 _RecordsetPtr的connection成员变量,让它自己创建数据连接。
如果你要使用多个记录集,最好的方法是使用已经创建了数据库连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。
_CommandPtr指针接口返回一个记录集。
CommandPtr提供了一种简单方法来执行返回记录集的存储过程和SQL语句。
可以利用全局 _ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。
一次或少量数据库访问操作,一般是直接使用连接串,如果需要频繁访问数据库,涉及返回多个记录集,那么,建议同_RecordsetPtr用法一样,使用全局数据库连接后,再使用_CommandPtr 接口执行存储过程和SQL语句。
各指针的定义方法:_ConnectionPtr m_pConnection;_RecordsetPtr m_pRecordset;_CommandPtr m_pCommand;3、连接、关闭数据库1、连接数据库示例连接ACCESS,以昨天的FavorMan为例。
::CoInitialize(NULL);//数据库操作前先初始化COM环境CString strSQL; //配置初始连接串strSQL="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=blogurl.mdb;";strSQL=strSQL+"Provider=Microsoft.Jet.OLEDB.4.0;"+"DataSource=blogurl.mdb;"+"Jet OLEDB:Database Password="+//str为上面读到数据库路径信息! DB_PASSWRD_STRING+";"+"Persist Security Info=False;"; //注意一定需要输入四个\\\\才能表示"\\"//如果单独输入,必须形式为"\\\\Abc\\db\\blogurl.mdb"格式!//--连接数据库-----------------HRESULT hr;try{hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象if(SUCCEEDED(hr)){hr =m_pConnection->Open((_bstr_t)strSQL,"","",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);///显示错误信息return FALSE;}2、关闭数据库if( m_pConnection->State )//如果连接有效m_pConnection->Close();m_pConnection = NULL;4、数据库访问_RecordsetPtr m_pRecordset;m_pRecordset.CreateInstance("ADODB.Recordset");try{//打开数据库m_pRecordset->Open("SELECT * FROM BlogUrl",m_pConnection.GetInterfacePtr(),//或使用_variant_t((IDispatch*)theApp.m_pConnection,true),,但需要extern声明theApp;adOpenDynamic,adLockOptimistic,adCmdText);//遍历读取while(!m_pRecordset->adoEOF)//adoEOF判断数据库指针是否已经到结果集末尾;BOF判断是否在第一条记录前面{vID =m_pRecordset->GetCollect("ID");//这里已经读到当前记录的ID,需要进行非空等判断,非空之后就可以处理,比如添加到列表框等。
//....m_pRecordset->MoveNext();}m_pRecordset->Close();//关闭记录集}catch(_com_error error){CString errorMessage;errorMessage.Format("%s",(LPTSTR)error.Description()); AfxMessageBox(errorMessage);}取得某字段的值有两种办法,一种是指定该字段名,另一种是指定该字段的ID 编号,从0开始。
假设上文的ID是从0开始,那么可以采用:m_pRecordset->GetCollect(_variant_t(long(0));也可以采用:pRecordset->get_Collect("ID");其它索引值读取类似处理。
附一些常用的执行语法:1、添加记录a、调用m_pRecordset->AddNew();b、调用m_pRecordset->PutCollect("ID",vID);给ID字段赋值c、调用m_pRecordset->Update();//确认并刷新入库2、修改记录方法类似添加记录,只是起初按照查询指定记录打开接口,比如SELECT * FROM ulist where ID=%d形式,不需要m_pRecordset->AddNew();,直接使用PutCollect("ID",vID)。
3、删除记录删除记录只需要把记录指针移动到要删除的记录上,然后调用m_pRecordset->Delete(adAffectCurrent)移动到指定记录上也有两种方法,一种直接使用查询指定记录(需要唯一字段)方式定位,另一种是使用Move(index)方式。
下面例子是使用Move方式到指定记录。
try{m_pRecordset->MoveFirst();//如果是采用SELECT * FROM ulist where ID=5方式打开数据库连接则不需要本句m_pRecordset->Move(5);//假设删除第5条记录,如果是采用SELECT * FROM ulist where ID=5方式打开数据库连接则不需要本句m_pRecordset->Delete(adAffectCurrent);m_pRecordset->Update();}catch(_com_error error){CString errorMessage;errorMessage.Format("%s",(LPTSTR)error.Description());AfxMessageBox(errorMessage);}4、_CommandPtr用法参考a、_CommandPtr指针初始化m_pCommand->ActiveConnection = m_pConnection;// 将库连接赋于它,或单独再创建也可以,根据实际需要定m_pCommand->CommandText = "SELECT * FROM BlogUrll";b、_CommandPtr与_RecordsetPtr配合读取记录集m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText);//执行SQL语句,返回结果记录集c、直接使用_ConnectionPtr执行SQL语句m_pConnection->Execute( _bstr_t CommandText,VARIANT * RecordsAffected,long Options )例如:m_pConnection->Execute("UPDATE BlogUrl SET ID= 1 WHERE ID =5",&RecordsAffected,adCmdText);5、遍历数据库中所有表名m_pRecordset = m_pConnect->OpenSchema(adSchemaTables);while(!(m_pRecordset ->adoEOF)){_bstr_t tblname =m_pRecordset->Fields->GetItem("TABLE_NAME")->Value;//获取表格_bstr_t tbltype =m_pRecordset->Fields->GetItem("TABLE_TYPE")->Value;//获取表格类型//这里可以对表格类型进行判断,判断后即可处理tblnameif (!strcmp(tbltype ,"TABLE")){AfxMessageBox(tblname);}m_pRecordset->MoveNext();}m_pRecordset->Close();6、遍历一个表中的所有字段//方法1:m_pRecordset = m_pConnect->OpenSchema(adSchemaColumns);while(!(m_pRecordset ->adoEOF)){_bstr_t colname =m_pRecordset->Fields->GetItem("COLUMN_NAME")->Value;//获取字段名AfxMessageBox(colname);m_pRecordset->MoveNext();}m_pRecordset->Close();//方法2:FieldsPtr pFields = NULL;HRESULT hr = m_pRecordset->get_Fields (&pFields);//得到记录集的字段集if(!SUCCEEDED(hr)) return;int iColCount;pFields->get_Count(&iColCount);//字段总数BSTR bstrColName;for(int i=0;i<iColCount;i++)//按记录集的各字段循环{//pFields->GetItem(_variant_t(i))->get_Name(&bstrColName);pFields->Item(_variant_t(i))->get_Name(&bstrColName);//获得字段名字CString csName=bstrColName;//pField->Item[i]->get_Type(&fType);//获取字段类型//pField->Item[i]->get_DefinedSize(&lSize);//获得字段的大小AfxMessageBox(csName);}if(NULL != hr)tblfields ->Release();//释放指针7、常用数据格式转换_variant_t var;BSTR bvar;CString csVar;_bstr_t bstr;_variant_t 转化为long型: (long)var;_variant_t转化为 CString型: csVar= (LPCSTR)_bstr_t(var);CString转化为_variant_t型: _variant_t(csVar);或(LPTSTR)(LPCTSTR)csVar;CString转化为BSTR型: bvar= csVar.AllocSysString(); BSTR转化为CString型:csVar= (LPCSTR)bvar;CString转化为_bstr_t型: bstr = (_bstr_t)csVar;_bstr_t 转化为CString型:csVar= (LPCSTR)bstr;。