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>三、其他操作打开管理员回复信息数据库,开始调用其中内容。
ADO对象操作Access数据库关键技术
ADO对象操作Access数据库关键技术ADO对象操作Access数据库关键技术ADO(ActiveX Data Object)是目前Microsoft通用的数据访问技术。
ADO编程模型定义一组对象,用于访问和更新数据源,它提供了一系列方法完成以下任务:连接数据源、查询记录、添加记录、更新记录、删除记录、检查建立连接或执行命令时可能产生的错误。
一、ADO对象ADO是基于组件的数据库访问接口,可以来自多种数据提供者的数据进行读取和写入操作。
ADO的3个成员对象:(1)Connection对象(连接对象):建立应用程序与数据源的连接。
(2)Command对象(操作命令对象):在创建数据连接的基础上,利用Command 对象可以实现对数据源的查询、插入、删除、编辑修改及更新操作。
(3)Recordset对象(记录集对象):执行数据访问或SQL命令得到动态记录集,它被缓存在内存中。
ADO的3个集合对象:(1)Errors集合对象。
它依赖于Connection对象的使用。
(2)Parameters集合对象。
它依赖于Command对象的使用。
(3)Fields集合对象。
它依赖于Recordset对象的使用。
1、Connection对象该对象用来实现应用程序与数据源的连接。
只有连接成功后,Command对象和Recordset对象才能访问某个数据库。
2、Command对象该对象主要作用是在VBA中用SQL语句访问、查询数据库中的数据,可以完成Recordset对象不能完成的操作,如创建表、修改表结构、删除表、将查询结果保存为新表等。
3、Recordset对象Recordset对象的功能最常用、最重要,它可以访问表和查询对象,返回的记录存储在Recordset对象中。
通过该对象可以浏览记录、修改记录、添加新记录或者删除特定记录。
二、在Access中引用ADO对象在Access的模块设计时要想使用ADO对象,首先应该增加一个对ADO库的引用。
ado连接 access 数据库
直接通过ADO操作Access数据库作者:徐景周下载示例源码上次经过<直接通过ODBC读、写Excel表格文件>和<直接通过DAO读、写Access文件>两篇文章,给大家介绍了ODBC和DAO两种数据库访问技术的基本使用方法,这次要给大家介绍的是ADO数据库访问技术的使用方法。
ADO(Active Data Object,活动数据对象)实际上是一种基于COM(组件对象模型)中的自动化接口(IDispatch)技术,并以OLE DB(对象连接和镶入的数据库)为基础,经过OLE DB精心包装后的数据库访问技术,利用它可以快速的创建数据库应用程序。
ADO提供了一组非常简单,将一般通用的数据访问细节进行封装的对象。
由于ODBC数据源也提供了一般的OLE DB Privider,所以ADO不仅可以应用自身的OLE DB Privider,而且还可以应用所有的ODBC驱动程序。
关于OLE DB和ADO的其它详细情况,读者可以自行查阅相关书籍或MSDN,这里就不一一说明了。
让我们直接步入主题,如何掌握ADO这种数据库访问技术。
ADO的操作方法和前面讲过的DAO的操作在很多方面存在相似之处,在这里,笔者为了更有效的说明它的使用方法,用VC6.0做了一个示例程序(AdoRWAccess),这个示例程序可以直接通过ADO来操作Access数据库,示例程序的运行效果如下图所示:在示例程序中我们仍采用原库结构,数据库名Demo.mdb,库内表名DemoTable,表内字段名为Name(姓名)和Age(年龄)的两个字段,来构造示例程序操作所需的Access数据库,这也和上两篇文章的示例源码中的库结构相兼容。
下面让我们看看ADO数据库访问技术使用的基本步骤及方法:首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用#import引用它既可。
ADO连接Access的几种规范做法
“Data Source=c:somepathmyDb.mdb;” & _ “User Id=admin;” & _ “Password=;” oConn.Open strConn ******************************************************** *** OLE DB Provider for ODBC Databases ******************************************************** 访问 MS Access 数据库 Dim oConn,strConn Set oConn=Server.CreateObject(“ADODB.Connection”) StrConn= “Provider=MSDASQL;” & _ “Driver={Microsoft Access Driver (*.mdb)};” & _ “Dbq=c:somepathmydb.mdb;” & _
ADO 连接 Access 的几种规范做法
大家知道 ADO 连接 Access 的几种规范吗?下面我们就给大家详细介绍一 下吧!我们积累了一些素材,在此拿出来与大家分享下,请大家互相指正。 ADO 连接 Access 的几种规范做法: ADO 数据对象用来连接数据库的方式有两种,分别是 ODBC 和 OLE DB 方 式 (一) 使用 OLE DB 方式 ******************************************************** *** OLE DB Provider for Microsoft Jet ******************************************************** Dim oConn,strConn Set oConn=Server.CreateObject(“ADODB.Connection”) StrConn= “Provider=Microsoft.Jet.OLEDB.4.0;” & _
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控件的属性对话框。
用ADO访问加密的Access数据库
MyConn.Open
-或-
Dim MyConn As New ADODB.Connection
provider。
MyConn.Open ConnectionString:=strConn
-或-
Dim MyConn As New ADODB.Connection
Dim strConn As String
MyConn.Open ConnectionString:=strConn
如果你打开一个数据库使用了Jet安全保护,你需要使用以下方式:
Dim MyConn As New ADODB.Connection
MyConn.Provider = "Microsoft.Jet.OLEDB.3.51"
Dim strConn As String
strConn = "Provider=Microsoft.Jet.OLEDB.3.51;"
"Data SourDB;" & _
如果你希望打开一个有口令保护的Access数据库,你可以用以下三种语法的任一种:
Dim MyConn As New ADODB.Connection
MyConn.Provider = "Microsoft.Jet.OLEDB.3.51"
MyConn.Properties("Data Source") = "C:\...\JetPassword.MDB"
VBAADO连接ACCESS数据库
VBAADO连接ACCESS数据库⼀、ACCESS数据库加密1、ACCESS 2013数据库加密⽅式(1)使⽤旧版加密(适⽤于反向兼容和多⽤户数据)(2)使⽤默认加密(安全性较⾼)ADO连接仅⽀持旧版加密,使⽤VBA代码动态创建带密码的Access 数据库⽂件,也是旧版加密。
2、数据库如果采⽤⼿⼯设置密码,则要设置为旧版加密⽅式:打开ACCESS 2013—Access选项—客户端设置—加密⽅法--使⽤旧版加密(适⽤于反向兼容和多⽤户数据)⼆、设置ADO连接ACCESS数据库⽅式⼀(1)引⽤ Microsoft ActiveX Data Objects 2.x Library(操作⽅式:Visual Basic-⼯具-引⽤,不同office版本不同)说明:当未引⽤,运⾏后会显⽰“⽤户定义类型未定义”(2)连接代码Sub 导⼊数据1()Dim cnn As ADODB.Connection '数据库连接Dim mydata As String '数据库的完整路径和名称Dim mytable As String '数据表名称Dim sql As String 'sql语句Dim rs As ADODB.Recordset '临时数据表纪录Dim i As Integer '循环数据变量(获取数据表字段)'1、连接数据库Set cnn = New ADODB.Connectionmydata = ThisWorkbook.Path & "\进销存数据库.accdb"With cnn.Provider = "Microsoft.ACE.OLEDB.12.0;Jet OLEDB:Database Password='123456'".Open mydataEnd With'2、建⽴与数据库的连接mytable = "采购数据3"sql = "select 采购数据3.ID,采购数据3.采购⽇期,采购数据3.供货类型,采购数据3.采购分类,采购数据3.供应商,采购数据3.名称,采购数据3.单位,采购数据3.单价,采购数据3.数量,采购数据3.⾦额,采购数据3.⼊账⽇期" & " from " & mytable & " order by 采购⽇期"Set rs = New ADODB.Recordsetrs.Open sql, cnn, adOpenKeyset, adLockOptimistic'3、复制数据库数据' (1)清除原数据ActiveSheet.Cells.ClearContents'(2)复制字段名For i = 1 To rs.Fields.CountCells(1, i) = rs.Fields(i - 1).NameNext i'(3)复制全部数据Range("A2").CopyFromRecordset rsrs.Closecnn.CloseSet rs = NothingSet cnn = NothingEnd Sub三、设置ADO连接ACCESS数据库⽅式⼆⽆需引⽤,直接创建连接Sub 导⼊数据2()Dim cnn As Object '数据库连接Dim strcnn As String 'ACCESS连接语句Dim mydata As String '数据库的完整路径和名称Dim mytable As String '数据表名称Dim sql As String 'sql查询语句Dim rs As Object '临时数据表纪录Dim i As Integer '循环数据变量(获取数据表字段)'1、连接数据库Set cnn = CreateObject("ADODB.Connection")mydata = ThisWorkbook.Path & "\进销存数据库.accdb"Select Case Application.Version * 1 '设置连接字符串,根据版本创建连接Case Is <= 11strcnn = "Provider=Microsoft.Jet.Oledb.4.0;Jet OLEDB:Database Password='123456';Data Source=" & mydataCase Is >= 12strcnn = "Provider=Microsoft.ACE.OLEDB.12.0;Jet OLEDB:Database Password='123456';Data Source=" & mydataEnd Selectcnn.Open strcnn '打开数据库链接'2、设置sql查询语句mytable = "采购数据3"Set rs = CreateObject("ADODB.Recordset")sql = "select 采购数据3.ID,采购数据3.采购⽇期,采购数据3.供货类型,采购数据3.采购分类,采购数据3.供应商,采购数据3.名称,采购数据3.单位,采购数据3.单价,采购数据3.数量,采购数据3.⾦额,采购数据3.⼊账⽇期" & " from " & mytable & " order by 采购⽇期"Set rs = cnn.Execute(sql) '执⾏查询,并将结果输出到记录集对象'3、复制数据库数据With ActiveSheet.Cells.ClearContentsFor i = 0 To rs.Fields.Count - 1 '填写标题.Cells(1, i + 1) = rs.Fields(i).NameNext i.Range("A2").CopyFromRecordset rs'.Cells.EntireColumn.AutoFit '⾃动调整列宽'.Cells.EntireColumn.AutoFit '⾃动调整列宽End Withrs.Closecnn.CloseSet rs = NothingSet cnn = NothingEnd Sub。
Vb利用ADO控件连接Access数据库验证
Vb利用ADO控件连接Access数据库验证——在窗体上利用文本框显示浏览数据、添加数据、保存数据、删除数据Vb利用ADO控件连接Access数据库有两种方法:方法一:是在adodc1的属性里设置数据库文件的路径,这种方法的优点是简单容易操作,确定是,当源文件换了路径后,要重新设置数据库的路径,否则就连接不上数据库了。
方法二:是用代码设置数据库的路径,这种方法的优点是只要源文件和数据库在同一个文件夹下,无论移动到哪里都能连接上。
Test2例子:要求在窗体上利用文本框浏览显示数据表中的数据、添加数据、保存数据。
首先建立数据库文件和表;打开vb,创建一工程和一个窗体,在需要调用数据库的窗体上加入一个adodc控件,默认名称为:adodc1;默认的情况下,工具栏里是没有这个控件的,可以打开工程——部件,勾上Microsoft ADO Data Control(OLEDB),然后确定,工具栏就会多了一个adodc控件。
第一种方法:略第二种方法:一、添加保存功能,运行效果如下图1、设计窗体如上,在窗体上添加标签、文本框、按钮、adodc控件2、分别设置窗体的load、按钮的click事件代码3、将其余的数据表中的数据也显示出来,并实现添加保存功能。
提示:只需要在窗体上添加若干标签、按钮控件,并设置文本框的datasource和datafield 属性值即可。
二、浏览记录1、在窗体上添加如下四个按钮,对应名称分别为:Command3、Command4、Command5、Command62、分别为上述四个按钮添加相应给你的代码(Command4_Click内的BOF修改为EOF)三、数据表中记录的删除删除按钮Command7的代码为:。
ADO连接access
ADO连接Access的例子1、在APP文件中添加:(AfxEnableControlContainer();)之前:自定义一个变量_ConnectionPtr m_pConnection1;////////////////////////////////////////////////////////////////////////// AfxOleInit();m_pConnection1.CreateInstance(__uuidof(Connection));try{// 打开本地Access库Demo.mdbm_pConnection1->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Demo.mdb","","",adModeUnknown);}catch(_com_error e){AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");return FALSE;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //名称:ExitInstance//功能:退出时清除工作///////////////////////////////////////////////////////////////////////////// int CLinkaccessApp::ExitInstance(){// TODO: Add your specialized code here and/or call the base class// 关闭ADO连接状态if(m_pConnection1->State)m_pConnection1->Close();m_pConnection1= NULL;return CWinApp::ExitInstance();}以下为在dlg中添加的代码由于需要在Dlg中调用App中的变量m_pConnection1,需要在dlg中添加:extern CLinkaccessApp theApp;BOOL CLinkaccessDlg::OnInitDialog(){CDialog::OnInitDialog();// 将\“关于...\”菜单项添加到系统菜单中。
使用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。
ADO操作Access数据库
ADO操作Access数据库1、要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll 的附属资源中。
在stdafx.h添加导入代码如下:#import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")2、新建一个Generic Class,取名AdoAccess3、在AdoAccess中添加如下成员变量如下:_ConnectionPtr m_pConnection; // 数据库_RecordsetPtr m_pRecordset; // 命令_CommandPtr m_pCommand; // 记录内容补充说明:1)_ConnectionPtr接口返回一个记录集或一个空指针。
通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。
使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。
对于要返回记录的操作通常用_RecordserPtr来实现。
而用_ConnectionPtr 操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。
2)_CommandPtr接口返回一个记录集。
它提供了一种简单的方法来执行返回记录集的存储过程和SQL 语句。
在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。
如果你只执行一次或几次数据访问操作,后者是比较好的选择。
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数据库
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.好了,编译运行一下喔,就可以看到效果了。
mfc使用ado连接access数据库
1.设置数据源打开控制面板--->系统和安全--->管理工具--->ODBC Data Sources(32 bit)这里需要注意的是,vc6.0是32位的,因此这里的数据源也必须是32位的,否则是连接不上的,这里我使用的是ACCESS数据库,数据源的配置如下:2.创建包含数据库的MFC对话框(其它也可以)工程,新建ADOConn类在工程中我们需要新建一个普通类ADOConn然后在ADOConn类头文件中加入以下导入声明和变量、函数声明:ADOConn.h---------------------------------------------------------------------------------#import "c:\Program Files\Common Files\System\ado\msado15.dll"no_namespace rename("EOF","adoEOF")//引入ADO库文件public:_ConnectionPtr m_pConnection;//连接对象指针_RecordsetPtr m_pRecordset;//记录集对象指针_CommandPtr m_pCommand;//命令对象指针ADOConn();virtual ~ADOConn();BOOL OnInitADOConn(CString Connstr);//初始化连接数据库BOOL ExecuteSQL(CString strSQL);//执行SQL语句BOOL ExecuteProc(CString ProcName);//执行存储过程BOOL GetCollect(CString FieldName,CString & strDest);//获得某个字段的值 BOOL GetRecordSet(CString strSQL);//获得记录集int GetRecordCount();//获得记录数//判断表TableName中是否存在字段KeyName的值为KeyValue的记录 BOOL RecordExist(CString TableName,CString KeyName,CString KeyValue); BOOL MoveFirst();//移动到第一条记录BOOL MoveNext();//移动到下一条记录BOOL Close();//关闭记录集BOOL CloseADOConnection();//关闭连接void dump_com_error(_com_error &e);//错误详细信息ADOConn.h---------------------------------------------------------------------------------然后在ADOConn类源文件中加入函数实现:ADOConn.cpp---------------------------------------------------------------------------------ADOConn::ADOConn()//构造函数{}ADOConn::~ADOConn()//析构函数{}BOOL ADOConn::OnInitADOConn(CString ConnStr)//初始化连接数据库{try{m_pRecordset.CreateInstance("ADODB.Recordest");m_pCommand.CreateInstance("mand");m_pConnection.CreateInstance("ADODB.Connection");_bstr_t strConnect=(_bstr_t)ConnStr;m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);AfxMessageBox("数据库连接成功");return true;}catch(_com_error e){AfxMessageBox("数据库连接失败");return false;}}BOOL ADOConn::ExecuteSQL(CString strSQL)//执行SQL语句{try{m_pConnection->BeginTrans();m_pConnection->Execute(_bstr_t(strSQL),NULL,adCmdText);m_pConnection->CommitTrans();return true;}catch(_com_error e){m_pConnection->RollbackTrans();AfxMessageBox("执行SQL语句失败");return false;}}BOOL ADOConn::ExecuteProc(CString ProcName)//执行存储过程{m_pCommand->ActiveConnection=m_pConnection;m_pCommand->CommandText=_bstr_t(ProcName);m_pCommand->Execute(NULL,NULL,adCmdStoredProc);return true;}catch(_com_error e){AfxMessageBox("执行存储过程失败");return false;}}BOOL ADOConn::GetCollect(CString FieldName,CString & strDest)//获得某个字段的值{VARIANT vt;try{vt=m_pRecordset->GetCollect(_variant_t(FieldName));switch(vt.vt){case VT_BSTR:strDest=(LPCSTR)_bstr_t(vt);break;case VT_DECIMAL:strDest.Format("%d",vt.intVal);break;case VT_DATE:{DATE dt=vt.date;COleDateTime da=COleDateTime(dt);strDest.Format("%d-%d-%d %d: %d: %d",da.GetYear(),da.GetMonth(),da. GetDay(),da.GetHour(),da.GetMinute(),da.GetSecond());break;}case VT_NULL:strDest="";break;}return true;}catch(_com_error e){AfxMessageBox(e.ErrorMessage());return false;}return true;}BOOL ADOConn::GetRecordSet(CString strSQL)//获得记录集{m_pCommand->CommandText=(_bstr_t)strSQL;m_pCommand->ActiveConnection=m_pConnection;m_pCommand->CommandType=adCmdText;m_pRecordset=m_pCommand->Execute(NULL,NULL,adCmdText);return true;}catch(_com_error e){AfxMessageBox("执行select语句失败");return false;}}int ADOConn::GetRecordCount()//获得记录数{DWORD nRows = 0;nRows=m_pRecordset->GetRecordCount();if(nRows==-1){nRows=0;if(m_pRecordset->adoEOF!=VARIANT_TRUE) m_pRecordset->MoveFirst();while(m_pRecordset->adoEOF!=VARIANT_TRUE){nRows++;m_pRecordset->MoveNext();}if(nRows>0)m_pRecordset->MoveFirst();}return nRows;}//判断表TableName中是否存在字段KeyName的值为KeyValue的记录BOOL ADOConn::RecordExist(CString TableName,CString KeyName,CString KeyValue) {CString countstr;countstr="select * from "+TableName+"where"+KeyName+"=\'"+KeyValue+"\'"; BOOL ret =GetRecordSet(countstr);if(ret){int ret2=GetRecordCount();if(ret2) return true;else return false;}else return false;}BOOL ADOConn::MoveFirst()//移动到第一条记录{try{m_pRecordset->MoveFirst();return true;}catch(_com_error e){AfxMessageBox("结果集移到第一个失败");return false;}}BOOL ADOConn::MoveNext()//移动到下一条记录{try{m_pRecordset->MoveNext();return true;}catch(_com_error e){AfxMessageBox("结果集移到下一个失败");return false;}}BOOL ADOConn::Close()//关闭记录集{try{m_pRecordset->Close();return true;}catch(_com_error e){AfxMessageBox("关系结果集失败");return false;}}BOOL ADOConn::CloseADOConnection()//关闭连接{try{if(m_pConnection->State){m_pConnection->Close();m_pConnection=NULL;return true;}else{AfxMessageBox("关闭数据库失败");return false;}}catch(_com_error e){AfxMessageBox("关闭数据库失败");return false;}}void ADOConn::dump_com_error(_com_error &e) //错误详细信息{CString ErrorStr;_bstr_t bstrSource(e.Source());_bstr_t bstrDescription(e.Description());ErrorStr.Format( "/n/tADO Error/n/tCode = %08lx/n/tCode meaning= %s/n/tSource = %s/n/tDescription = %s/n/n",e.Error(), e.ErrorMessage(), (LPCTSTR)bstrSource,(LPCTSTR)bstrDescription );//在调试窗口中打印错误信息,在Release版中可用DBGView查看错误信息::OutputDebugString((LPCTSTR)ErrorStr);#ifdef _DEBUGAfxMessageBox(ErrorStr, MB_OK | MB_ICONERROR);#endif}ADOConn.cpp---------------------------------------------------------------------------------3.编写代码连接数据库(这里我用的是ACCESS数据库)这里我们可以在任意.CPP(源文件)中声明ADOConn ado;然后在其他.CPP中使用的时候,只需要在头部加上extern ADOConn ado;当然,在定义的类中同样可以使用,举例如下:然后进行连接数据库的代码如下://进行数据库连接if(!AfxOleInit()){AfxMessageBox("OLE initialzation failed");return FALSE;}CString str="DSN=rapidquery";//这个字符串中的rapidquery就是我们之前设置的数据源的名称ado.OnInitADOConn(str);//调用dao对象去连接数据库,连接成功会提示,连接失败也会提示。
ADO连接ACCESS数据库
首先在StdAfx.h中加入建立连接:(在xxApp文件中) 1 声明变量2 建立连接(1) AfxOleInit初始化OLE 为应用程序的支持。
BOOL AFXAPI AfxOleInit( );返回值非零,如果成功;0,如果初始化失败,可能,因为安装该OLE 系统DLL 的错误版本。
备注调用此函数初始化OLE 为MFC 应用程序的支持。
当调用该函数时时,将发生以下操作: ∙初始化调用应用程序的当前单元COM 库。
有关更多信息,请参见OleInitialize。
∙创建消息筛选器对象,IMessageFilter实现接口。
此消息筛选器可捕获与调用AfxOleGetMessageFilter。
如果AfxOleInit从MFC DLL 调用,则调用将失败。
该失败,因为该函数,假设,则为; 如果从DLL 调用,该OLE 系统由调用应用程序之前初始化。
必须初始化MFC 应用程序设置为单线程单元。
(STA) 如果对您的InitInstance重写的CoInitializeEx,请指定COINIT_APARTMENTTHREADED (而不是COINIT_MULTITHREADED)。
AfxOleInit()与CoInitialize(NULL)的区别OLE是建立在COM之上的技术,层次比COM要高。
AfxOleInit()调用的是OleInitialize(),而OleInitialize()除了调用CoInitializeEx()来初始化COM库外,还进行一些其它的操作,这些操作对OLE应用来说是必须的,这些OLE应用包括:(1)Clipboard;(2)Drag and drop;(3)Object linking and embedding(现在的OLE,已不再仅仅是Object linking and embedding 的概念);(4)In-place activation;与AfxOleInit()对应的是,AfxOleTerm()。
VC++ ADO连接ACCESS详解
int main(){//该程序使用ADO连接ACCESS(装office的时候里面有)数据库后缀为.mdb 运行平台vc6.0//2003平台在写着//---------------------------------------------------------------------------------//ADO数据库连接分五步走,//第一、获取连接(只到数据库在什么地方)//第二、打开连接 open(必要的用户名和密码)//第三、获取字符集 ResultSet(类似数组的数据存储对象),//第四、显示数据//第五、关闭数据集、关闭连接//创建个连接对象_ConnectionPtr m_pConnection;//对连接进行初始化CoInitialize(NULL);//---------------------------------------------------------------------------------//第一步、获取连接//---------------------------------------------------------------------------------//同过连接(Connection)创建并获取一个数据库连接实例,//也可以把他看成句柄(电影门票)有里他就有资格使用数据库里的资源了呵呵m_pConnection.CreateInstance(__uuidof(Connection));// 又于在数据库连接的时候有有可能会出现错误,比如数据源设置或用户名密码错误等//所以使用try{....}catch(){...}捕获try{}里的异常(错误)//并把这些异常放到_com_error e 这个变量里,我们可以同过他获取错误的信息//并且,在出错的时候程序一定回运行catch(){....}里的东西,我们看到如果连接错误的时候//会执行cout<<"数据库连接失败,确认数据库mydb.mdb是否在当前路径下!"<<endl;// return FALSE; 之后推出程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ado连接 access 数据库.txt-//自私,让我们只看见自己却容不下别人。
如果发短信给你喜欢的人,他不回,不要再发。
看着你的相片,我就特冲动的想P成黑白挂墙上!有时,不是世界太虚伪,只是,我们太天真。
直接通过ADO操作Access数据库作者:徐景周下载示例源码上次经过<直接通过ODBC读、写Excel表格文件>和<直接通过DAO读、写Access 文件>两篇文章,给大家介绍了ODBC和DAO两种数据库访问技术的基本使用方法,这次要给大家介绍的是ADO数据库访问技术的使用方法。
ADO(Active Data Object,活动数据对象)实际上是一种基于COM(组件对象模型)中的自动化接口(IDispatch)技术,并以OLE DB(对象连接和镶入的数据库)为基础,经过OLE DB精心包装后的数据库访问技术,利用它可以快速的创建数据库应用程序。
ADO提供了一组非常简单,将一般通用的数据访问细节进行封装的对象。
由于ODBC数据源也提供了一般的OLE DB Privider,所以ADO不仅可以应用自身的OLE DB Privider,而且还可以应用所有的ODBC驱动程序。
关于OLE DB和ADO的其它详细情况,读者可以自行查阅相关书籍或MSDN,这里就不一一说明了。
让我们直接步入主题,如何掌握ADO这种数据库访问技术。
ADO的操作方法和前面讲过的DAO的操作在很多方面存在相似之处,在这里,笔者为了更有效的说明它的使用方法,用VC6.0做了一个示例程序(AdoRWAccess),这个示例程序可以直接通过ADO来操作Access数据库,示例程序的运行效果如下图所示:在示例程序中我们仍采用原库结构,数据库名Demo.mdb,库内表名DemoTable,表内字段名为Name(姓名)和Age(年龄)的两个字段,来构造示例程序操作所需的Access数据库,这也和上两篇文章的示例源码中的库结构相兼容。
下面让我们看看ADO数据库访问技术使用的基本步骤及方法:首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用#import引用它既可。
可以直接在Stdafx.h文件中加入下面语句来实现:#import "c:\program files\common files\system\ado\msado15.dll" \no_namespace \rename ("EOF", "adoEOF")其中路径名可以根据自己系统安装的ADO支持文件的路径来自行设定。
当编译器遇到#import语句时,它会为引用组件类型库中的接口生成包装类,#import语句实际上相当于执行了API涵数LoadTypeLib()。
#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。
语句no_namespace说明ADO对象不使用命名空间,rename ("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。
其次,在程序初始过程中需要初始化组件,一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下面语句CoUnInitialize();来实现。
在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始化COM和结束时关闭COM的操作,语句如下所示: AfxOleInit();接着,就可以直接使用ADO的操作了。
我们经常使用的只是前面用#import语句引用类型库时,生成的包装类.tlh中声明的智能指针中的三个,它们分别是_ConnectionPtr、_RecordsetPtr和_CommandPtr。
下面分别对它们的使用方法进行介绍:1. _ConnectionPtr智能指针,通常用于打开、关闭一个库连接或用它的Execute方法来执行一个不返回结果的命令语句(用法和_CommandPtr中的Execute方法类似)。
l 打开一个库连接。
先创建一个实例指针,再用Open打开一个库连接,它将返回一个IUnknown的自动化接口指针。
代码如下所示:_ConnectionPtr m_pConnection;// 初始化COM,创建ADO连接等操作AfxOleInit();m_pConnection.CreateInstance(__uuidof(Connection));// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,// 因为它有时会经常出现一些意想不到的错误。
jingzhou xutry{// 打开本地Access库Demo.mdbm_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);}catch(_com_error e){AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");return FALSE;}l 关闭一个库连接。
如果连接状态有效,则用Close方法关闭它并赋于它空值。
代码如下所示:if(m_pConnection->State)m_pConnection->Close();m_pConnection= NULL;2. _RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。
l 打开数据表。
打开库内表名为DemoTable的数据表,代码如下:_RecordsetPtr m_pRecordset;m_pRecordset.CreateInstance(__uuidof(Recordset));// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,// 因为它有时会经常出现一些意想不到的错误。
jingzhou xutry{m_pRecordset->Open("SELECT * FROM DemoTable", // 查询DemoTable表中所有字段theApp.m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针 adOpenDynamic,adLockOptimistic,adCmdText);}catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}l 读取表内数据。
将表内数据全部读出并显示在列表框内,m_AccessList为列表框的成员变量名。
如果没有遇到表结束标志adoEOF,则用GetCollect(字段名)或m_pRecordset->Fields->GetItem(字段名)->Value方法,来获取当前记录指针所指的字段值,然后再用MoveNext()方法移动到下一条记录位置。
代码如下所示:_variant_t var;CString strName,strAge;try{if(!m_pRecordset->BOF)m_pRecordset->MoveFirst();else{AfxMessageBox("表内数据为空");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);}catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}l 插入-记录。
可以先用AddNew()方法新增一个空记录,再用PutCollect(字段名,值)输入每个字段的值,最后再Update()更新到库中数据既可。
其中变量m_Name和m_Age 分别为姓名及年龄编辑框的成员变量名。
代码所下所示:try{// 写入各字段值m_pRecordset->AddNew();m_pRecordset->PutCollect("Name", _variant_t(m_Name));m_pRecordset->PutCollect("Age", atol(m_Age));m_pRecordset->Update();AfxMessageBox("插入成功!");}catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}l 移动记录指针。
移动记录指针可以通过MoveFirst()方法移动到第一条记录、MoveLast()方法移动到最后一条记录、MovePrevious()方法移动到当前记录的前一条记录、MoveNext()方法移动到当前记录的下一条记录。
但我们有时经常需要随意移动记录指针到任意记录位置时,可以使用Move(记录号)方法来实现,注意: Move()方法是相对于当前记录来移动指针位置的,正值向后移动、负值向前移动,如:Move(3),当前记录是3时,它将从记录3开始往后再移动3条记录位置。
代码如下所示:try{int curSel = m_AccessList.GetCurSel();// 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针m_pRecordset->MoveFirst();m_pRecordset->Move(long(curSel));}catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}l 修改记录中字段值。