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数据库并进行修改添加
ADO控件连接ACCESS数据库并进行修改添加
一、连接access及其工作列表
1、引用ADO控件和DataGRID显示控件
2、拖入两个控件和新建三个BT按钮,一个文本框数组(0-2)
因为在ACCESEE中,列的顺序是从0 开始。
第一个字段为0。
3、设置ADO控件:连接ACCESS。
难点!
选择4.0的这个驱动器后,选择相应的.xls的access数据库文件。
默认允许打开.mdb文件,选择全部类型文件就可以打开access文件啦。
Access的特殊性在于:设置扩展属性。
以上就将access连接好了,下面需要设置连接access 的那个工作表【Sheet1…….】,
4、连接工作列表注意[Sheet1$]
此时已经连接好access及其工作列表。
二、关联ADO控件和DataGrid显示控件
1、在DataGrid显示控件属性栏中,选择DateSource——Adodc1。
将数据和显示器连接。
2、显示access的字段和数据
3、为了能够进行数据库读写,需要设置显示控件的属性
三、关联显示控件和文本框代码如下:
Private Sub DataGrid1_Click()
For i = 0 To 2
Text1(i).Text = DataGrid1.Columns(i)
Next i
End Sub
四、设置命令按钮实现数据读写。
效果如下。
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
在VC++中使用ADO访问Access数据库摘要ADO具有易于使用、速度快、内存支出少和磁盘痕迹小的有点。
并且提供了轻量高性能的接口。
ADO(ActiveEx Data Object)是Microsoft数据库应用程序开发接口,是建立在OLE DB之上的高层数据访问技术。
即使我们对OLE DB 和COM不了解,也能轻松使用ADO,因为它非常的简单易用,甚至比以前的ODBC API、DAO都要容易使用,并不适灵活性。
同时它也提供了多语言访问技术包括Visual C++,Visual Basic和VBA等。
使用ADO编程一般有以下几个步骤组成:(1)连接到一个数据源;(2)打开指定的数据集;(3)执行所需的查询;(4)把数据检索到一个能够在C++代码中很容易访问的对象中;(5)提供检测错误的一般方法。
2.ADO对象的详细介绍如下表:使用Command对象查询数据库并返回 Recordset 对象中的记录,以便执行大量操作或处理数据库结构。
可以使用Command对象的集合、方法、属性进行下列操作:∙使用CommandText属性定义命令(例如,SQL 语句)的可执行文本。
∙通过Parameter对象和Parameters集合定义参数化查询或存储过程参数。
∙可使用Execute方法执行命令并在适当的时候返回Recordset对象。
∙执行前应使用CommandType属性指定命令类型以优化性能。
∙使用Prepared属性决定提供者是否在执行前保存准备好(或编译好)的命令版本。
∙使用CommandTimeout属性设置提供者等待命令执行的秒数。
∙通过设置ActiveConnection属性使打开的连接与Command 对象关联。
∙设置Name属性将Command标识为与Connection对象关联的方法。
∙将Command对象传送给Recordset的Source属性以便获取数据。
注意如果不想使用Command对象执行查询,请将查询字符串传送给Connection对象的Execute方法或Recordset对象的Open方法。
VC++使用ADO开发ACCESS数据库
//#include "Shlwapi.h" //#pragma comment(lib,"shlwapi.lib") if(PathFileExists(str)) { CString strTemp; strTemp.Format("%s 已存在!",str); AfxMessageBox(strTemp); return ; } //定义 ADOX 对象指针并初始化为 NULL //用 ADOX 创建 access 数据库方法很简单, //只需要新建一个 Catalog 对象,然后调用它的 Create 方法就可以了。 //Catalog 是 ADOX 的一个对象,它包含描述数据源模式目录的集合。 //在这里,您只需知道创建数据库时使用这个对象就可以了。 //注意用 try...catch 组合捕捉错误 _CatalogPtr m_pCatalog = NULL; CString DBName="Provider=Microsoft.JET.OLEDB.4.0;Data source="; DBName=DBName+str; try { m_pCatalog.CreateInstance(__uuidof(Catalog)); m_pCatalog->Create(_bstr_t((LPCTSTR)DBName)); } catch(_com_error &e) { AfxMessageBox(e.ErrorMessage()); return ; } } 使用 ADOX,需要引入 ADOX 的动态链接库 msadox.dll,即在 stdafx.h 中加 入如下语句: #import "C:\Program Files\Common Files\system\ado\msadox.dll" no_namespace rename("EOF","adoEOF") 另 外 , ADOX 属 于 COM 对 象 , 所 以 要 在 CADOXCreateDatabaseApp::InitInstance()函数中加入: if(!AfxOleInit()) { AfxMessageBox("OLE 初始化出错!"); return FALSE; } 初始化 COM。 好了,编译并运行该例程,对于编译过程中弹出的 4146 号警告不要理会。
使用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 访问数据库方法择优
VC通过 ADO 访问数据库方法择优Visual C++ 是一个编程语言,它可以通过 ADO(ActiveX 数据对象)来访问数据库。
ADO 是微软 Windows 上的一个内置数据库工具,它可以帮助开发者轻易地访问关系型数据库。
ADO 通过提供一套 COM(组件对象模型)接口,让开发者能够连接并操作不同类型的数据库,包括 Microsoft Access、Oracle 和 SQL Server 等。
以下是 VC 通过 ADO 访问数据库的方法择优描述。
1. 使用 ODBC 连接字符串ODBC(开放式数据库连接)是一个开放式标准,通过它,应用程序可以访问多个数据库,这些数据库可能来自于不同的供应商。
使用 ODBC 连接字符串可以通过 ADO 访问数据库。
它的优点是可以访问不同类型的数据库,但缺点是连接字符串比较麻烦,并且性能较差。
2. 使用 DSN 连接DSN(数据源名称)是一个名称,它通常与一个特定的数据库链接相关联。
使用 DSN 可以通过 ADO 访问数据库。
它的主要优点是连接字符串比较简单,但缺点是不能访问所有类型的数据库,并且性能稍差。
3. 使用 Jet 数据库引擎Jet 数据库引擎是一个文件级数据库,可以与ADO 一起使用,用于访问 Microsoft Access 数据库。
它的主要优点是可以访问Microsoft Access,不需要安装其他数据库软件,但缺点是不能访问其他类型的数据库,并且性能较差。
4. 使用 SQL Server OLE 数据提供程序SQL Server OLE 数据提供程序是一个为 SQL Server 设计的ADO 数据提供程序,它可以通过 ADO 访问 SQL Server 数据库。
它的主要优点是可以访问 SQL Server 数据库,但缺点是不能访问其他类型的数据库,并且需要安装 SQL Server 客户端软件(如 SQL Native Client)。
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.好了,编译运行一下喔,就可以看到效果了。
VC中使用ADO进行数据库开发的一些资料的整理
VC中使用ADO进行数据库开发的一些资料的整理1.导入ado库在StdAfx.h中,加入如下代码#import "c:\program files\common files\system\ado\msado15.dll" \no_namespace rename("EOF","adoEOF") renam e("BOF","adoBOF") 初试化在app的InitInstance中,加入AfxOleInit();(MFC)或者CoInitialize(NULL)如果用了CoInitialize退出时,要调用CoUninitialize()注意,如果在线程中也使用了com,那么在线程中也要用CoInitialize初始3.连接数据库_ConnectionPtr m_pAppConn;hResult = m_pAppConn.CreateInstance(_T("ADODB.Connection"));///创建Connection对象然后连接之m_pAppConn->Open("Provider=Microsoft.Jet.OLEDB.4.0 ; \Data Source = .\\DataBase\\aa.mdb","","",adModeUnknown);BOOL OpenConnect(){HRESULT hResult;CloseConnect();try{hResult = m_pAppConn.CreateInstance(_T("ADODB.Connection"));///创建Connection对象 if(SUCCEEDED(hResult)){m_pAppConn->Open("Provider=Microsoft.Jet.OLEDB.4.0 ; \Data Source = .\\DataBase\\aa.mdb","","",adModeUnknown);}}catch(_com_error e)///捕捉异常{CString errormessage;errormessage.Format(_T("连接数据库失败!\r\n错误信息:%s"),e.ErrorMessage()); AfxMessageBox(errormessage);hResult = -1L;}return (SUCCEEDED(hResult) ? TRUE : FALSE);}这里连接的数据库是access数据库,在工程目录下的DataBase\aa.mdb关键连接的字符窜,如果是accessProvider=Microsoft.Jet.OLEDB.4.0;Data Source=\\192.168.1.1\DataBase\aa.mdb; 这是局域网上的文件Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\DataBase\\aa.mdb;本机上的如果是sql 2000Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=sa;Initial Catalog=aa;Data Source=192.168.1.1;数据库在192.168.1.1上,数据库名字是aa4.关闭连接BOOL CloseConnect(){HRESULT hResult=0;try{if(m_pAppConn!=NULL){if(m_pAppConn->State!=adStateClosed){hResult=m_pAppConn->Close();}m_pAppConn.Release();}}catch(_com_error e){_bstr_t bstrSource(e.Source());_bstr_t bstrDescription(e.Description());TRACE(_T("\n Source : %s \n Description : %s\n"),(LPCSTR)bstrSource,(LPCSTR)bstrDescription);hResult=-1L;}return (SUCCEEDED(hResult) ? TRUE : FALSE);}5.使用recodeset打开记录_variant_t RecordsAffected;_RecordsetPtr pRecordset = NULL;strSql = _T("SELECT field FROM table");pRecordset.CreateInstance(_uuidof(Recordset));pRecordset = pConn->Execute (_bstr_t(strSql) , &RecordsAffected , adCmdUnknown); 其中&RecordsAffected 可以获得有多少记录返回,这是记录的影像数目6.关闭记录集if(pRecordset != NULL && pRecordset->State){pRecordset->Close();pRecordset = NULL;}7.判断是否为空if (pRecordset->adoBOF && pRecordset->adoEOF) {//MessageBox("没有符合条件的记录存在!","提示");if(pRecordset != NULL && pRecordset->State){pRecordset->Close();pRecordset = NULL;}return;}8,从记录集取数据_variant_t var;pRecordset->MoveFirst();for(;!pRecordset->adoEOF;pRecordset->MoveNext()) {var = pRecordset->GetCollect(_T("field"));}9.几种常见数据的转换如果是字符窜的字段var = pRecordset->GetCollect(_T("field"));if(var.vt!=VT_NULL){str= (LPCTSTR)_bstr_t(var);}if(var.vt!=VT_NULL)判断是必须的,如果是空,转换会出错如果是int形int aa = atoi(str)_variant_t是个可变类型,支持很多种类型,10.使用command利用Command对象来执行SQL命令_CommandPtr m_pCommand;m_pCommand.CreateInstance("mand");_variant_t vNULL;vNULL.vt = VT_ERROR;vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它m_pCommand->CommandText = "SELECT * FROM users";///命令字串m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集如果使用记录集的open来打开command对象.如果在Source 参数中传送 Command 对象并且同时传递ActiveConnection 参数,那么将产生错误。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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库。
需要读者朋友注意的是:您的开发环境中msado15.dll不一定在这个目录下,请按实际情况修改;在编译的时候可能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告:msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned。
3、创建Connection对象并连接数据库为了首先我们需要添加一个指向Connection对象的指针_ConnectionPtr m_pConnection,下面的代码演示了如何创建Connection对象实例及如何连接数据库并进行异常捕捉:BOOL CADOTest1Dlg::OnInitDialog(){CDialog::OnInitDialog();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("连接数据库失败!rn错误信息:%s",e.ErrorMessage());AfxMessageBox(errormessage);///显示错误信息}在这段代码中我们是通过Connection对象的Open方法来进行连接数据库的,下面是该方法的原型:HRESULT Connection15::Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options );上述函数中参数ConnectionString为连接字串;参数UserID是用户名;参数Password是登陆密码;参数Options是连接选项,用于指定Connection对象对数据的更新许可权,一般情况下Options可以是如下几个常量:adModeUnknown:缺省。
当前的许可权未设置adModeRead:只读adModeWrite:只写adModeReadWrite:可以读写adModeShareDenyRead:阻止其它Connection对象以读权限打开连接adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接adModeShareExclusive:阻止其它Connection对象以读写权限打开连接adModeShareDenyNone:阻止其它Connection对象以任何权限打开连接我们给出一些常用的连接方式供大家参考:(1)通过JET数据库引擎对ACCESS2000数据库的连接:m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=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={SQL Server};Server=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown);其中Server是SQL服务器的名称,DATABASE是库的名称。
Connection对象除Open()方法外还有许多方法,我们先介绍Connection对象中两个有用的属性ConnectionTimeOut与State。
ConnectionTimeOut用来设置连接的超时时间,需要在Open之前调用,例如:m_pConnection->ConnectionTimeout = 5;///设置超时时间为5秒m_pConnection->Open("Data Source=adotest;","","",adModeUnknown);State属性指明当前Connection对象的状态,0表示关闭,1表示已经打开,我们可以通过读取这个属性来作相应的处理,例如:if(m_pConnection->State)m_pConnection->Close(); ///如果已经打开了连接则关闭它4、执行SQL命令并取得结果记录集为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset"),SQL命令的执行可以采用多种形式,下面我们一一进行阐述。
(1)利用Connection对象的Execute方法执行SQL命令Execute()方法的原型如下所示:_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )其中CommandText是命令字串,通常是SQL命令。
参数RecordsAffected是操作完成后所影响的行数, 参数Options表示CommandText中内容的类型,Options可以取如下值之一:adCmdText表明CommandText是文本命令;adCmdTable表明CommandText是一个表名;adCmdProc表明CommandText是一个存储过程;adCmdUnknown表明CommandText内容未知。
Execute()函数执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明:_variant_t RecordsAffected;///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthdaym_pConnection->Execute("CREATE TABLE users(ID INTEGER,usernameTEXT,old INTEGER,birthday DATETIME)",&RecordsAffected,adCmdText);///往表格里面添加记录m_pConnection->Execute("INSERT INTO users(ID,username,old,birthday)VALUES (1, 'Washington',25,'1970/1/1')",&RecordsAffected,adCmdText);///将所有记录old字段的值加一m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);///执行SQL统计命令得到包含记录条数的记录集m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROMusers",&RecordsAffected,adCmdText);_variant_t vIndex = (long)0;_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量m_pRecordset->Close();///关闭记录集CString message;message.Format("共有%d条记录",vCount.lVal);AfxMessageBox(message);///显示当前记录条数(2)利用Command对象来执行SQL命令_CommandPtr m_pCommand;m_pCommand.CreateInstance("mand");_variant_t vNULL;vNULL.vt = VT_ERROR;vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它m_pCommand->CommandText = "SELECT * FROM users";///命令字串m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);//执行命令取得记录集在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。