ADO.NET数据库访问技术
一. ado.net的定义
ado.net来源于com组件库ado(即activex data objects),是微软公司新一代.net数据库的访问模型,是目前数据库程序设计人员用来开发基于.net的数据库应用程序的主要接口。它利用.net data provider(数据提供程序)进行数据库的连接和访问,通过ado.net数据库程序能够使用各种对象来访问符合条件的数据库内容,让提供数据库管理系统的各个厂商可以根据此标准开放对应的.net data provider,这样设计数据库应用程序人员不必了解各类数据库底层运作的细节,只要掌握ado.net所提供对象的模型,便可访问所有支持.net data provider的数据库。
ado.net结构模型如下所示:
图1. ado.net结构模型
ado.net是一个类库,这些类提供了很多的对象,可用于完成数据库连接和增删查改等操作。其中包括如下五个对象: 1)connection:用来连接数据库(sql server使用的是sqlconnection对象); 2)command:用来对数据库执行sql命令,如增删查改等操作; 3)datareader:用来从数据库中返回只读数据,用数据源填充dataset对象; 4)dataadapter:与dataset对象相结合使用,实现对数据库的控制; 5)dataset:可看作离线时内存中的数据库; 这五个对象提供了两种读取数据库的方式; 第一种方式:使用connection、command、datareader,其权限只能读取或查询数据库; 第二种方式:使用connection、command、dataadapter、dataset,其权限能进行各种数据库的操作。 ado.net读取数据库操作示意图:
图1. ado.net结构模型
二. 使用ado.net在线访问数据库的步骤(这里用的是sql server 数据库)
1. 连接数据库
直接上一段代码:
using system.data.sqlclient; string source = "server=(local); integrated security=sspi; database=mydateabase;user id=sa;pwd=sa"; sqlconnection conn = new sqlconnection(source); conn.open(); // 对数据库数据进行操作 conn.close();
(1). 首先添加命名空间system.data.sqlclient;
(2). 定义数据库连接字符串:
第一种方法:直接把数据库连接字符串存放在字符串对象中,如上代码所示;
第二种方法web:将数据库连接信息存放在web.config配置文件中,然后通过使用configurationstringsettings类进行调用。来个例子说明一下:
(a). 首先,在web.config配置文件的部分定义数据库连接信息:
<configuration> <connectionstrings> <add name="mydatabase" connectionstring="server=(local); integrated security=sspi; database=mydateabase;user id=sa;pwd=sa" providername="system.data.sqlclient" /> </connectionstrings> </configuration>
(b). 在项目文件中,添加对configuration的引用,在头部添加using system.configuration。然后定义数据库连接字符串为:
备注:必须添加对system.configuration程序集的引用,才能解析上述代码中使用的configurationmanager类。
2. 创建数据库连接
1)创建connection对象:
string conn = new sqlconnection(connstring);
2)打开数据库: conn.open(); 一般情况下,当在.net中使用“稀缺”的资源时,如数据库连接、窗口或图形对象,最好确保每个资源在使用完毕后立即关闭。尽管.net的设计人员实现了自动垃圾收集机制,垃圾最终会被回收,但仍需要尽可能早地释放资源,以避免出现资源匮乏的情况。 当编写访问数据库的代码时,因为使连接打开的时间略长于需要的时间,就可能影响其他会话。在极端的情况下,不关闭连接可能会使其他用户无法进入一整组数据表,极大地降低应用程序的性能。主要有两种方式可以确保数据库连接等类似的“稀缺”资源在使用完后立即释放。这两种方式如下: (1)第一种方式:采用try...catch...finally语句块 确保在finally中关闭任何已打开的连接。
try { // open the connection conn.open(); // 对数据库数据进行操作 } catch (sqlexception ex) { // log the exception } finally { conn.close(); }
在给定的方法中可能会打开许多资源,这样try...catch...finally块的层次有时候不容易看清。还有一种方式可以确保资源的关闭——using语句。 (2)使用using语句块
using(sqlconnection conn = new sqlconnection(connstring)){ // open the connection conn.open(); // 对数据库数据进行操作 }
无论块是如何退出的,using子句都会确保关闭数据库连接。
3. 创建数据库操作命令:
connection对象与数据源建立连接后,使用command对象对数据源执行查询、插入、修改和删除等操作。
(1) 创建sql数据库操作命令: sqlquery查询语句具体规则请详见我的系列文章:【读书笔记】sql server查询语句_邓智容 (2) 创建command对象:
(a). 方法一:
(b). 方法二:
sqlcommand command = new sqlcommand("sql语句", conn);
备注: 1). sql查询语句若含有c#程序的变量并以字符串形式连接,则应注意数据为非数字的变量应用单引号括起来; 2). 在sql查询语句中使用参数化查询语句的话,譬如:
command.commandtext = "select * from mytable where sitename=@sitename";
当需要给该参数赋值时,可以使用command对象建立参数对象,然后再赋值:
备注: 在.net framework 2.0中sqlclient增加了addwithvalue(string parametername, object value)方法。该方法简化了调用储存过程的输入参数过程,在运行时对所输入的数据类型进行判断,获取对应的数据库类型。 因此该方法在运行效率上比用 add(string parametername, sqldbtype sqldbtype, int size, string sourcecolumn)方法要低。 在效率要求较高的地方仍然建议使用add()方法,其它场合可以使用addwithvalue()简化代码编写量。
4. 执行sqlquery命令:
定义好命令后,就需要执行它。执行的语句有多种方式,这取决于要从命令中返回什么数据。command类提供了下述可执行的命令: (1) executenonquery() —— 执行命令,但不返回任何结果。一般用于update、insert或delete语句中,其中唯一的返回值是受影响的记录个数。但如果调用带有输出参数的存储过程,该方法就有返回值。 (2) executereader() —— 执行命令,返回一个类型化的idatareader。是从数据源中选择某些数据的最简单快捷的方法。 (3) executescalar() —— 执行命令,返回结果集中的第一行第一列的值。
5. 对数据库操作完毕后关闭数据库连接:
conn.close();
三. 离线数据库访问
dataadapter对象主要在connection对象和dataset对象之间执行数据的传输工作,将数据填充到dataset对象中,也可把dataset对象更新后的数据返回到数据源中,也可架构在command对象上,通过commandbuilding对象生成dataadapter的insert、update和delete等sql操作命令。使用dataset和datatable对象访问数据源后,ado.net会自动离线,在内存中处理数据,如有修改数据的操作,将自动重新连接数据源,更新数据库。dataset对象、dataadapter对象与数据源之间的关系如下:
dataset <---> dataadapter <---> 数据源
下面是使用dataadapter进行离线数据库访问的操作步骤:
1. 创建dataadapter、datatable对象(使用的是sql server数据库)
2. 将数据填充到datatable对象
da.fill(ds, "tablename"); dt = ds.tables["tablename"];
3. 对datatable中的数据进行处理 tatatable对象的属性和方法有:
名称 属性/方法 说明
rows.add() 方法 插入新数据行
rows[n].delete() 方法 删除第n行的记录
rows.count 属性 获取行数
rows[i]["columnname"] 属性 获取第i行、列名为columnname的值
rows[i][j] 属性 获取第i行、第j列的值
还有一种数据查询技术:linq。下回再讨论。
通过以上对ado.net数据库访问技术的介绍,希望对大家有所帮助。