ADO.NET
概述
ADO.NET是一种数据访问技术,使得应用程序可以连接到数据存储,并以各种方式操作存储在其中的数据。
该技术基于.NET Framework,与.NET Framework类库的其余部分(Connection,Command,DataReader,DataSet,DataAdapter,DataTable等)高度集成。
ADO.NET允许和不同类型的数据源(文本文件,Excel表格,XML文件,数据库)进行交互。
因为不同的数据源采用不同的协议,所以对于不同的数据源必须采用相应的协议。一些老式的数据源使用ODBC协议,许多新的数据源使用OleDb协议,并且现在还不断出现更多的数据源,这些数据源都可以通过.NET的ADO .NET类库来进行连接。
ADO.NET的五大对象
1、Connection:建立与数据源的连接。
MSSQL Server常用连接字符串: Integrated Security(集成安全),Persist Security Info(保持安全信息)
String connStr="Data Sourse=(local);Initial Catalog=数据库名;Integrated Security=True;Persist Security Info=True;User ID=用户名;Password=密码";
MySQL常用连接字符串:
String connStr="Server=ServerAddress;Database=数据库名;Uid=用户名;Pwd=密码";
Oracle常用连接字符串:
String connStr="Data Source=Address;User Id=用户名;Password=密码";
连接池:建立一个数据库连接是非常消耗时间和消耗资源的事情,ADO.NET提供了名为连接池的优化方法。
连接池就是一个容器,它存放了一定数量的与数据库服务器的物理连接。因此,当我们需要连接数据库服务器的时候,只需去池(容器)中取出一条空闲的连接,而不是新建一条连接。这样的话,我们就可以大大减少连接数据库的开销,从而提高了应用程序的性能。
连接池具有类别区分,同一个时刻同一应用程序域可以有多个不同类型的连接池。细致的讲,连接池是由进程、应用程序域、连接字符串以及windows标识(在使用集成的安全性时)共同组成签名来标识区分的。但对于同一应用程序域来说, 一般只由连接字符串来标识区分。当打开一条连接时,如果该条连接的类型签名与现有的连接池类型不匹配,则创建一个新的连接池。反之,则不创建新的连接池。
例如:
//创建连接对象1 using (SqlConnection conn1 = new SqlConnection("DataSource=(local);Integrated Security=SSPI;Initial Catalog=Northwind")) { conn1.Open(); } //创建连接对象2 using (SqlConnection conn2 = new SqlConnection("DataSource=(local);Integrated Security=SSPI;Initial Catalog=pubs")) { conn2.Open(); } //创建连接对象3 using (SqlConnection conn3 = new SqlConnection("DataSource=(local);Integrated Security=SSPI;Initial Catalog=Northwind")) { conn3.Open(); }
创建了三个SqlConnection对象,但是管理时只需要两个连接池。因为conn1与conn3的连接字符串相同,所有可以共享一个连接池。conn2与conn1,conn3不同,所以需要创建新的连接池。
连接池相关连接字符串属性:
Connection Timeout:连接请求等待超时时间(默认为15秒)
Max Pool Size:连接池中最大连接数(默认为100)
Min Pool Size:连接池中最小连接数(默认为0)
Pooling:是否启用连接池(ADO.NET默认是启动)
2、Command:用于对数据库发出SQL命令,从而执行增删查改操作。
默认初始化属性:
CommandText="";
CommandTimeout=30;
CommandType=CommandType.Text;
Connection=null;
重要方法:
ExecuteNonQuery():执行非Select查询,返回受影响的行数,主要执行添加,删除,更新等操作。
ExecuteReader():执行Select查询,返回一个封装了只读只进游标的DataReader对象。
ExecuteScalar():执行Select查询,返回第一行第一列的Object值,常用于聚合函数查询。
简例:
String connStr = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ToString(); using (SqlConnection conn = new SqlConnection(connStr)) { String strNonSelectSql = "insert into table_name values(@argument)"; SqlCommand cmd = new SqlCommand(strNonSelectSql, conn); SqlParameter para = new SqlParameter("@argument", "value"); cmd.Parameters.Add(para); int result = cmd.ExecuteNonQuery(); }
3、DataReader:数据读取器。
SqlDataReader是连接相关的,SqlDataReader中的查询结果并不是放在程序中,而是放在数据库服务器中,SqlDataReader只是相当于一个指针(游标),只能读取当前游标指向的行,连接断开就不能再读取。这样无论查询结果有多少条,对程序占用的内存都几乎没有影响。但SqlDataReader对于小数据量的数据来说带来的只有麻烦。
简例:
String connStr = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ToString(); using (SqlConnection conn = new SqlConnection(connStr)) { String strSelectSql = "select * from table_name"; SqlCommand cmd = new SqlCommand(strSelectSql, conn); using (SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection)) { while (dr.Read()) { // 读取数据 String str = dr[0].ToString(); } } }
4、DataAdapter:数据适配器,充当数据库和ADO.NET对象模型中断开连接的对象之间的桥梁,用来填充DataSet对象中的表,而且能读取缓存的更改并将其提交给数据库。
简例:
DataSet dataSet = new DataSet(); using (SqlConnection conn = new SqlConnection("")) { conn.Open(); SqlCommand command = conn.CreateCommand(); command.CommandText = "select name,age,address from MyInformation"; SqlDataAdapter dataAdapter = new SqlDataAdapter(command); dataAdapter.Fill(dataSet); //填充数据 }
5、DataSet:是独立于数据存储区且与之不同的数据结构,是一种代表关系数据的内存驻留结构。
对象关系图:


浙公网安备 33010602011771号