浅析ADO.NET五大对象
来源:互联网 发布:盐城软件开发培训 编辑:程序博客网 时间:2024/06/08 23:57
引言
在数据库应用系统中,必定要涉及到对数据库的访问和操作,而ADO.NET则是微软在.NET Framework中负责数据访问的类的库集,那么理清ADO.NET中的五大对象对于我们理解ADO.NET无疑会有很大的帮助。
本文将对ADO.NET做简单的介绍,分析五大对象Connection、Command、DataReader、DataAdapter、DataSet,以及他们之间的关系。
发展
早在1997年时,微软已经开发了许多的数据访问方式,例如DAO(Data Access Object)对象、可以跨越网络访问数据的RDO(Remote Data Objects)以及让DAO组件可以访问ODBC数据源的ODBCDirect技术等等。
如此多的技术,为了减少企业与开发人员在选择、学习与应用上产生的困难,同时适逢COM与OLE的发展,微软将数据访问的核心开始改写为以COM为主的OLE DB,并且在它上面创建一个新的数据访问模型ADO(ActiveX Data Objects)。
然而ADO本身的架构仍然有缺陷(尤其是在开发网络应用程序时,最好的例子就是Recordset无法脱机)。于是在1998年时,微软提出了一个下一代的应用程序开发框架(Application Framework)的项目,其中就包括Storage+,而ADO+就是Storage+的一支。
2000年的时候,微软的Microsoft .NET项目开始成形,许多的微软产品都冠上.NET的标签,ADO+也不例外,改名为ADO.NET,并包装到.NET Framework类库中,成为.NET平台中唯一的数据访问组件。
分析
一图胜过千言万语,在对五个对象详细介绍之前,先用一张图来说明它们之间的关系:
Connection
建立与特定数据源的连接。 所有 Connection 对象的基类均为 DbConnection 类,是所有数据库操作的基础,在对数据库操作之前要先建立数据连接。
- 实例说明(仅以SqlConnection为例):
string connectionString = "";//连接字符串SqlConnection connection = new SqlConnection(connectionString)//初始化 SqlConnection 类的新实例connection.Open();//打开数据库连接connection.Close();//关闭连接
- 使用connection连接的时候记得打开、关闭,建议使用using,确保连接始终关闭,这样可确保在代码退出代码块时自动关闭连接。
using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); // }
Command
对象定义了将对数据源执行的指定命令。 表示要对数据库执行的一个 Transact-SQL 语句或存储过程。所有 Command 对象的基类均为 DbCommand 类。
DataReader
从数据源中读取只进且只读的数据流。 所有 DataReader 对象的基类均为 DbDataReader 类,DataReader对象只允许以只读、顺向的方式查看其中所存储的数据,提供一个非常有效率的数据查看模式,同时DataReader对象还是一种非常节省资源的数据对象。
DataAdapter
DataAdapter对象充当DataSet和数据源之间用于检索和保存数据的桥梁。DataAdapter类代表用于填充DataSet以及更新数据源的一组数据库命令和一个数据库连接。表示一组 SQL 命令和一个数据库连接,它们用于填充 DataSet 和更新数据源。
DataSet
驻留于内存的数据集,可以看做是内存中的数据库,内部用XML来描述数据。 也因此可以说DataSet是数据表的集合,它可以包含任意多个数据表(DataTable), 独立于各种数据源。
说明
这里将对数据库的操作大致分为两类,一类是对数据库的查询,需要返回查询数据。一类是对数据库的增、删、改,不需要返回查询数据。下面就以这两类,结合实例说明。
查询:从上图中可以看到,想得到查询结果有三种方式:
- 通过Command对象的ExecuteScalar方法(),但是这种方法只能返回由查询返回的结果集中的第一行的第一列,并且其返回值为object类型,其他列或行将被忽略。
ExecuteScalar()经常使用于当需要返回单一值时的情况。例如你刚插入一行数据,想要立即知道它的ID号,则可以使用ExecuteScalar()方法。通过MSDN给出的一个例子说明。
static public int AddProductCategory(string newName, string connString){ Int32 newProdID = 0; string sql = "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "+ "SELECT CAST(scope_identity() AS int)"; using (SqlConnection conn = new SqlConnection(connString)) { SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.Add("@Name", SqlDbType.VarChar); cmd.Parameters["@name"].Value = newName; try { conn.Open(); newProdID = (Int32)cmd.ExecuteScalar(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } return (int)newProdID;}
- 通过DataReader对象接收Command对象的ExecuteReader方法()的返回值,DataReader从数据库中检索只读、只进的数据流。
使用DataReader可以提高应用程序的性能,原因是它只要数据可用就立即检索数据,并且(默认情况下)一次只在内存中存储一行,减少了系统开销。下面是MSDN实例。
private static void ReadOrderData(string connectionString){ string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;";//sql语句 using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(queryString, connection); connection.Open(); SqlDataReader reader = command.ExecuteReader(); try { while (reader.Read()) { Console.WriteLine(String.Format("{0}, {1}",reader[0], reader[1])); } } finally { // 读完数据后,调用关闭 reader.Close(); } }}
- 通过DataAdapter对象将查询到的数据填充到DataSet中。
private void Button_Click(object sender, RoutedEventArgs e){ string conStr = "";//连接字符串 using (SqlConnection conn = new SqlConnection(conStr)) { conn.Open();//打开连接 string sql = "";//sql语句 SqlDataAdapter sda = new SqlDataAdapter(sql,conn);//实例化SqlDataAdapter对象 DataSet ds = new DataSet(); sda.Fill(ds);//填充数据集 }}
添加、修改、删除,从上图中可以看到,有两种方式:
- 通过Command对象的ExecuteNonQuery 方法 (),可以使用 ExecuteNonQuery来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行 UPDATE、INSERT 或 DELETE 语句。
private static void CreateCommand(string queryString,string connectionString){ using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(queryString, connection); command.Connection.Open(); command.ExecuteNonQuery(); }}
- 使用DataSet来更数据库中的数据。
static private DataSet UpdateDataSet(string connectionString){ DataSet dataSet = new DataSet();//实例化数据集dataset using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open();//打开连接 SqlDataAdapter adapter = new SqlDataAdapter();//实例化SqlDataAdapter对象 SqlCommandBuilder builder = new SqlCommandBuilder(adapter); adapter.Fill(dataSet);//填充数据集dataset dataSet.Tables[0].Rows[0][0] = 2;//修改数据 adapter.Update(dataSet);//更新dataset } return dataSet;}
小结
以上就是对ADO.NET五大对象的简单分析,文章中出现的例子有的是MSDN上的实例,有的是自己写的,水平有限,难免会有错误,欢迎指正,一起学习。
参考资料:
https://zh.wikipedia.org/wiki/ADO.NET
https://msdn.microsoft.com/zh-cn/library/system.data.sqlclient%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
http://developer.51cto.com/art/201005/198221.htm
- 浅析ADO.NET五大对象
- ADO.NET五大对象
- ADO.NET五大对象
- ADO.NET五大对象
- ADO.NET五大对象
- ADO.NET五大对象
- ADO.NET五大对象
- ASP.net: ADO的五大对象
- ADO.NET的五大对象
- 黑马程序员 ADO.NET五大对象
- 黑马程序员-ADO.NET五大对象
- 浅谈ado.net 五大对象
- ADO.NET 中的五大对象
- ADO.NET的五大对象
- ADO.Net 5大对象
- ADO.NET的五大核心类
- ADO.NET的五大核心类
- ADO.NET的五大核心类
- java socket 上传文件与对话自由选择(不过只能监听一个客户端,因为没有用while循环)
- 关于easyuidatagrid获取datagrid的选择数据
- CentOS7+Docker+Redis3环境搭建
- 迭代器是什么?
- Swift学习笔记之基本数据类型-数组与字典
- 浅析ADO.NET五大对象
- Oracle SQL Developer 打开无法使用的问题
- 百度地图开发中可能出现的问题
- ios上视频与音乐合成后出现播放兼容问题的解决方法
- android扫一扫 二维码显示结果中文乱码
- Android中weight 出现权重大但是所占的比例小问题
- jsp <c:forEach>循环 以及怎么统计变量的总数量
- java final 修饰符
- Codeforces--658C--Bear and Forgotten Tree 3(模拟&&技巧)(好题)