日期:2014-05-16 浏览次数:20400 次
首先上两个通用的图:
上面这两个图都是描述Ado.net的工作原理的。
应用程序读取数据共有三种方式:
(1)直接通过Command对象读取(但一次只能对一条数据,即表的一行),读完后不断开连接。
(2)通过DataReader对象读取(类似单向管道似的,一条一条的读数据),读完后不断开连接。
(3)通过DataAdapter一次读一堆数据(这个堆就是DataSet),读完后就断开数据库连接了。
应用程序更新和插入数据共有两种方式:
由于DataReader是单向的,所有不能用于插入和更新数据,只能从数据库读取数据,所以应用程序更新和插入数据只有上面的(1)和(3)两者方式。
从Ado.net的工作原理图可以看出,不管用哪种方式和数据库打交道,都必须有三个的东西:Connection,Command和Sql语句。
第(1)种方式如下图:
图中把工厂比喻成数据库,把商城仓库比喻成应用程序所在内存,把Command比喻成取货员“二愣子”(因为他比较笨),把Sql语句比喻成订单,把桥比喻成数据库连接对象。
第(1)方式的工作过程就是,首先要j架设好桥,然后二愣子拿到订单(Sql语句)后,就往工厂跑,把订单给工厂管理员,取回订单所需的货物(数据)后,再折返回来把货物放入仓库(内存)。但是由于一个人的力量有限,二愣子来回跑的过程中,一个来回只能搬回一件货物。这时候连接不能断(桥不能拆),因为每次需要取一件货物的时候,二愣子都需要来回跑。
方式(1)的总体印象就是,“二愣子”不断的来回跑。
第(2)种方式的工作过程就是,架设好桥后,二愣子拿着“订单”往工厂跑,但这次的订单比较复杂,他相当于一份合同,要求和工厂建立一个管道,仓库需要什么货物,直接操作管道的一头的控制按钮,则管道另一头会自动提取需要的货物并通过管道输送到仓库。这样“二愣子”就只需要跑一趟就行了(这份工作轻松、高兴!)。这时候连接也不能断(管道不能断),只有保持连接才能不断的一件件从工厂取货物并通过管道输送到仓库。
方式(2)的总体印象就是,有一天单向管道。
如下图:
第(3)种方式的工作过程就是,架设好桥后,二愣子拿着“订单”开着车往工厂跑,但这次订单要求的货物比较多,工厂就把这一堆货物帮二愣子装上车,二愣子高高兴兴的开着车兜着风把这一堆货物运回去。这次二愣子不仅能兜风,而且也只跑一趟(这份工作真拉风!)。车开回来后就可以断开连接了(完全可以把桥拆了),因为需要的所有货物都已经通过货车运回来了。此时,货车就比喻为DataAdapter对象,DataSet对象就比喻成货车拉回来的那“一堆货物的集合”。
方式(3)的总体印象就是,“二愣子”开着货车。
见下图:
另外,网上有一个更好看点的图(意义和上图一样),如下:
总结:从上面的图可以看出,无论用什么方式取货物都必须有三个东西参与才能完成:桥,二愣子,订单。即:Connection,Command和Sql语句。实际上在使用DataAdapter的时候可能看不到Command对象,其实DataAdapter也是必须通过Command对象取货物的,只不过DataAdapter内部自己有Command对象而已,DataAdapter使用自己内部的Command对象(这点从最上面的Ado.net原理图可以看出)。
取货物就是从数据库中取数据,更新和插入数据到数据库的过程和取数据一样,也需要Connection,Command和Sql语句这三个东西,此不赘述。
具体代码如下:
假设配置文件如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="Northwind" providerName ="System.Data.SqlClient" connectionString ="server=(local); integrated security = SSPI; database = Northwind" /> </connectionStrings> </configuration>
(1)直接通过Command对象读取(但一次只能对一条数据,即表的一行),读完后不断开连接。
第一步:建立Connection对象(桥)
string connectionString = ConfigurationManager.ConnectionStrings[connectionName].ConnectionString.ToString(); //从配置文件中取出连接字符串
SqlConnection conn = new SqlConnection(connectionString); conn.Open(); //打开连接
第二步:建立SQL语句(订单)
string sqlStr=“ Select * from Student where ID='10' ”;
第三步:建立Command对象(二愣子),用这个对象直接返回一个行数据。
SQLCom