使用 ado.net 解锁 microsoft access 数据(1)-.net教程,数据库应
来源:作者: 发布时间:2007-12-26 02:13:19


使用 ado.net 解锁 microsoft access 数据
paul cornell
microsoft corporation
2001 年 12 月 6 日
microsoft® office 提供了多种存储和管理数据的功能和工具,例如,数据访问对象 (dao)、activex® 数据对象 (ado)、microsoft word 邮件合并、microsoft excel web 查询、microsoft query、数据访问页、microsoft access 数据项目、office 数据连接、office 数据链接等等。而 microsoft .net 平台则提供了其他的数据访问功能和工具,例如,ado.net、.net 数据连接和数据库项目。
在本月的专栏中,我将介绍怎样使用 microsoft visual studio® .net、microsoft visual basic® .net,特别是怎样使用 ado.net 来解锁和管理 microsoft access 数据。
确定何时最适合使用 ado.net
既然 office 已提供了一系列数据访问功能和工具,为什么不利用 office 来管理他自己的数据呢?当然,在许多情况下,您可能希望使用适合某个特定数据任务的内置 office 功能和工具。然而,ado.net 提供了一种添加数据连接和编写数据解决方案代码的统一方法,这种方法不同于 office 中的多个数据入口点和数据访问库。
假如您愿意,仍然能够在 visual studio .net 和 visual basic .net 中调用 ado 功能。但鉴于以下原因,和 ado 相比,ado.net 在许多方面都是更好的数据访问解决方案。
ado.net 允许在数据集中包含多个表,包括这些表之间的关系。ado 只允许包含一个结果表(虽然此单个结果表可能是多个相关表上所执行的 join 操作的结果)。
ado.net 提供断开连接的数据访问。ado 也能够提供断开连接的数据访问,但 ado 主要是为连接的数据访问而设计的。
ado.net 提供了一个记录导航范例,允许进行无序的数据访问(和有序的 ado move 方法不同),并能够利用数据表之间的关系访问各个数据表。
因为 ado.net 使用 xml 传送数据,所以能够提供比 ado 更丰富的数据类型,获得更好的数据访问性能,还能够使数据穿过防火墙传递。
ado.net 经过了高度优化,以配合 microsoft sql server 7.0 和 microsoft sql server 2000 数据库的使用(反映在 ado.net sql 对象中),同时提供对其他 ole db 数据源(如 microsoft access 数据库)的编程访问(反映在 ado.net oledb 对象中)。
当然,假如希望利用 .net 中的诸多新功能,就应该使用 .net 数据访问功能和工具。有关 .net 平台的周详信息,请参阅以前的专栏 introducing .net to office developers(英文)。
ado.net 入门
图 1 显示了使用 ado.net 时要用到的主要对象。
图 1:ado.net 对象模型中的主要对象(来源:inside .net managed providers [英文])
这些对象包括:
oledbconnection 和 sqlconnection 对象,代表数据库连接,类似于 ado 的 connection 对象。
oledbcommand 和 sqldbcommand 对象,代表将要直接发送到数据库的 sql 文本字符串,类似于 ado 的 command 对象。
oledbdataadapter 和 sqldataadapter 对象,用于保存数据库的 select、insert、update 和 delete 命令。这些对象能够作为数据库和 dataset 对象之间的中介。能够使用 fill 方法填充 dataset 对象并从数据库断开连接,然后使用 update 方法重新连接到数据库,并将在 dataset 对象中所做的更改保存回数据库。
dataset 对象包含实际数据的副本,类似于断开连接的 ado recordset 对象。dataset 对象能够包含 datarelation 对象和 contraint 对象,这两个对象分别代表数据表之间的关系和这些表中数据的约束。dataset 对象还能够包含 datatable 对象,该对象又能够包含 datacolumn 和 datarow 对象。使用 datatablemapping 对象和 datacolumnmapping 对象,数据集能够将数据库中的表和列映射为相应的 datatable 对象和 datacolumn 对象。
sqldatareader 对象和 oledbreader 对象代表连接的、仅向前移动的、只读数据读取器。假如能够保持和数据库的持续连接,并且只希望读取数据而不进行更改,这是很有用的。在这种情况下,无需创建 dataset 对象。数据读取器类似于连接的、仅向前移动的、只读 ado recordset 对象。
作为参考,在使用 ado 的 office visual basic for applications (vba) 中,能够通过以下方法打开罗斯文示例 access 数据库,将数据从 products 表复制到 recordset 对象,并报告记录集中第一条数据记录的某些数据:
office vba 和 ado 代码 - adocode.bas。
public sub adoexample()
首先配置对 ado 库的引用。
dim objconn as adodb.connection
dim objrs as adodb.recordset
set objconn = new adodb.connection
objconn.connectionstring = "provider=microsoft.jet.oledb.4.0;" & _
"user id=admin;" & _
"data source=c:\program files\microsoft " & _
"office\office10\samples\northwind.mdb"
objconn.open
set objrs = objconn.execute("select * from products")
objrs.movefirst
msgbox prompt:=objrs.fields("productname").value & ", " & _
objrs.fields("unitsinstock").value
objrs.close
objconn.close
end sub
假如您以前在 ado 中进行过编码,则此 ado 代码是很简单的:
声明 ado 的 connection 对象和 recordset 对象,他们分别引用数据库的连接和数据库的基础数据。
connection 对象的 connectionstring 属性配置为数据库特定的 string 值,该值代表连接到数据库(本例中为罗斯文数据库)所需要的信息。
connection 对象的 open 方法建立了实际的数据库连接。
connection 对象的 execute 方法从数据库检索数据,并将检索到的数据放入 recordset 对象。
recordset 对象的 movefirst 方法移至记录集中的第一条记录。
recordset 对象的 fields 属性引用记录中的特定列,而 field 对象的 value 属性将检索字段中的实际数据。
作为比较,下面是一些用于控制台应用程式的 visual basic .net 示例代码,使用 ado.net 执行大体相同的操作,但他并不将数据放入记录集,而是由一个 ado.net 数据读取器保持和数据的连接:
visual basic .net 和 ado.net 代码 - adonetcode.vb。
使用连接的 ado.net 数据访问。
控制台应用程式。
imports system.data.oledb
module module1
sub main()
首先配置对 system.data.dll 的引用。
dim objconn as new oledbconnection _
("provider=microsoft.jet.oledb.4.0;" & _
"user id=admin;" & _
"data source=c:\program files\microsoft" & _
"office\office10\samples\northwind.mdb")
objconn.open()
dim objcmd as new oledbcommand _
("select * from products", objconn)
dim objdatareader as oledbdatareader = objcmd.executereader
objdatareader.read()
console.write(objdatareader.item("productname") & ", " & _
objdatareader.item("unitsinstock"))
end sub
end module
下面是该代码的工作方式:
代码 imports system.data.oledb 有助于减少访问对象或对象的成员时所需的工作量。例如,尽管能够在 ado 中编写 adodb.recordset 代码,但通常并不这样做,因为已引用了 adodb 库。同样,尽管能够在 ado.net 中编写 system.data.oledb.oledbconnection 代码,但假如已导入了和 oledbconnection 对象关联的名称空间 system.data.oledb(假设我们已预先配置了对 system.data.dll 的引用),也就无需进行编码。
在 ado 中,必须首先声明一个 connection 类型的对象,然后使用 connectionstring 属性定义连接信息。而在 .net 中,我们使用参数化构造函数和初始值设定项的概念,只需一行代码便能够声明 oledbconnection 类型的对象,并定义连接信息。
和 ado 类似,在 ado.net 中,使用 oledbconnection 对象的 open 方法建立实际的数据库连接。
接下来,声明 ado.net 的 oledbcommand 对象,以便存储从数据库检索数据的命令。
然后声明 ado.net 的 oledbdatareader 对象,从数据库读取数据。
通过使用 oledbcommand 对象的 executereader 方法,该代码允许数据读取器访问数据库中的特定数据。
oledbdatareader 对象的 read 方法将读取数据库中的第一条记录。
console.write 方法将数据从特定列(使用 oledbreader 对象的 item 属性)写入命令窗口。
下面是另一段 visual basic .net 示例代码,执行和前面的 ado.net 示例相同的操作。但在这一示例中,数据将被复制到 ado.net 数据集,然后断开和数据库的连接:
visual basic .net 和 ado.net 代码 - adonetcode.vb。
使用断开连接的 ado.net 数据访问。
控制台应用程式。
imports system.data.oledb
module module1
sub main()
首先配置对 system.data.dll 的引用。
dim objconn as new oledbconnection _
("provider=microsoft.jet.oledb.4.0;" & _
"user id=admin;" & _
"data source=c:\program files\microsoft" & _
"office\office10\samples\northwind.mdb")
objconn.open()
dim objadapter as new oledbdataadapter _
("select * from products", objconn)
dim objdataset as new dataset()
objadapter.fill(objdataset)
with objdataset.tables("table").rows(0)
console.write(.item("productname") & ", " _
& .item("unitsinstock"))
end with
end sub
end module
下面是此代码和前一 ado.net 示例的区分:
和 oledbdatareader 对象类似,oledbadapter 对象也是从数据库访问数据,但这里使用了 oledbadapter 对象的 fill 方法,将数据表和他们之间的关系从数据库复制到 dataset 对象。
dataset 对象的 tables 属性访问数据集的任何表,而 rows 属性访问数据集中给定表的单个行。
能够在 office vba 中使用 ado.net 吗?
虽然您可能希望在 office vba 中使用 ado.net 的新功能,但现在还不能这样做。这是因为,假如运行 regasm.exe(.net frameworks sdk 中的程式集注册工具)将 system.data.dll 注册为 com(office vba 基于此技术),然后尝试从 office 引用生成的类型库文档,则不会在 office visual basic 的对象浏览器中显示任何成员。这是因为 com 不能识别核心的私有 ado.net 成员和参数化的构造函数。因此,至少在现在,还只能继续在 office vba 中使用 ado。
使用 visual studio .net 数据访问工具
visual studio .net 提供了许多便利工具用于访问 office 数据,包括创建可重复使用的数据连接、数据库项目连同数据表单向导。
数据连接
数据连接允许您一次性定义数据库连接的周详信息,然后在多个解决方案中重复使用该信息。下面的示例介绍怎样在 visual studio .net 中创建可重复使用的数据连接:
在 tools(工具)菜单上,单击 connect to database(连接到数据库)。将显示 data link properties(数据链接属性)对话框。
在 provider(提供程式)选项卡上,单击相应的数据提供程式,然后单击 next(下一步)。例如,要连接到 access 的罗斯文示例数据库,请单击 microsoft jet 4.0 ole db provider(microsoft jet 4.0 ole db 提供程式)。
在所选数据提供程式的 connection(连接)选项卡中填入信息。例如,对于罗斯文示例数据库,请单击 select or enter a database name(选择或输入数据库名称)框旁边的 ... 按钮,浏览至 northwind.mdb,然后单击 open(打开)。
单击 test connection(测试连接)。假如连接成功,单击 ok(确定)。否则,请重新检查 connection(连接)选项卡上的信息。
单击 ok(确定),关闭 data link properties(数据链接属性)对话框。
这样就有了一个能够添加到 visual studio .net 项目的可重复使用的数据连接。
下面基于这些步骤给出一个示例,说明怎样创建 ado.net 对象,这些对象能够和 server explorer(服务器资源管理器)窗口中的现有数据连接进行交互操作:
在 windows 应用程式项目的 designer(设计器)视图中,在 view(视图)菜单上,单击 server explorer(服务器资源管理器),展开所需的数据连接,然后将表、视图或存储过程拖动到设计界面上。visual studio .net 将创建一个 oledbconnection/sqlconnection 对象(取决于数据库的类型)、一个 oledbdataadapter/sqldataadapter 对象和四个 oledbcommand/sqlcommand 对象,用于选择、插入、更新和删除数据。
右击 oledbdataadapter/sqldataadapter 对象,并单击 generate dataset(生成数据集)。在本例中,选择 new(新建),保留 dataset1 的默认配置,选中要添加到数据集的表,选中 add this dataset to the designer(将此数据集添加到设计器中),然后单击 ok(确定)。visual studio .net 将创建一个 dataset 对象。
右击 oledbdataadapter/sqldataadapter 对象,并单击 preview data(预览数据),单击 fill dataset(填充数据集),然后单击 close(关闭)。
注意:在 visual studio .net beta 2 中,不会显示 fill dataset(填充数据集)按钮,以便生成实际填充 dataset 对象的代码。可能需要手动向 form_load 或 page_load 事件添加代码,如下所示:me.oledbdataadapter1.fill(datasetname11)。
下面的示例介绍怎样在 windows 窗体中添加数据网格,并绑定到前一示例中生成的现有数据集:
在 designer(设计器)视图中,单击工具栏上的 windows forms(windows 窗体)选项卡,然后双击 datagrid。
在 datagrid1 的 properties(属性)窗口中,为 datasource 属性选择 dataset11,然后为 datamember 属性选择表。
运行应用程式。
假如 datagrid1 中未显示数据,请在 form_load 事件中添加类似如下的代码:me.oledbdataadapter1.fill(datasetname11)。
提示:要在 server explorer(服务器资源管理器)窗口中没有现有数据连接的情况下创建 ado.net 对象,请执行以下步骤:
在设计视图中,单击工具栏上的 data(数据)选项卡。请注意,这在 code(代码)视图中无效。
将 ado.net 对象拖动到设计界面上。
右击 ado.net 对象,并单击 properties(属性)。
填写所选 ado.net 对象的相应属性。
数据库项目
visual studio .net 数据库项目允许您快速创建面向数据库的解决方案。下面的示例介绍怎样在 visual studio .net 中创建数据库项目:
在 file(文档)菜单上,指向 new(新建),然后单击 project(项目)。
在 project types(项目类型)窗格中,展开 other projects(其他项目),然后单击 database projects(数据库项目)。
在 templates(模板)窗格中,单击 database project(数据库项目)。
填写 name(名称)和 location(位置)框,然后单击 ok(确定)。
单击 add to solution(添加到解决方案)按钮将此项目添加到现有解决方案;或单击 close solution(关闭解决方案)按钮,创建单独的解决方案。
在 add database reference(添加数据库引用)对话框中,选择现有的数据连接,或单击 add new reference(添加新引用),以添加新的数据连接。假如单击 add new reference(添加新引用),请执行上一节中的步骤完成 data link properties(数据链接属性)对话框。假如使用此方法添加新的数据连接,数据连接将显示在 server explorer(服务器资源管理器)窗口中。
数据表单向导
visual studio .net 数据表单向导允许您快速连接到数据库,并生成简单的用户界面,用于显示数据并和数据进行交互。要使用数据表单向导,请执行以下步骤:
在 windows 应用程式项目中,在 project(项目)菜单上,单击 add windows form(添加 windows 窗体)。
在 templates(模板)窗格中,单击 data form wizard(数据窗体向导),单击 open(打开),然后单击 next(下一步)。
在 create a new dataset named(创建新数据集)框中,键入 dataset1,然后单击 next(下一步)。
选择现有的数据连接或创建新数据连接,然后单击 next(下一步)。
选择要向 dataset1 填充的项,然后单击 next(下一步)。
假如选择多项,请定义各项之间的关系,然后单击 next(下一步)。
定义要在表单中显示的表和列,然后单击 next(下一步)。
选择显示样式选项,然后单击 finish(完成)。
注意:请确保将新数据表单配置为启动表单,方法如下:在 project(项目)菜单中,单击 properties(属性)。展开 common properties(通用属性)文档夹,单击 general(常规),在 startup object(启动对象)列表中选择该数据表单,然后单击 ok(确定)。
注意:请确保将 dataset1 中的数据绑定到数据表单,这能够通过向数据表单的 load 事件插入以下代码来实现:me.oledbdataadapter1.fill(objdataset1)
运行应用程式:在 debug(调试)菜单上,单击 run(运行)。
扩展的 ado.net 代码示例
为了向您演示更多的 ado.net 代码,在本月专栏的最后,我将介绍几个在 ado.net 中创建的扩展的代码示例。
|
还没有关于此文章的相关评论!