C#中提供的数据库访问ADO.NET的结构图。
![](http://sa.csai.cn/tszl/images/c1.jpg)
ADO.NET的数据访问技术的架构。ADO.NET支持SQL Server数据访问和OLE DB数据访问。两者相比,前者是针对SQL Server的数据库访问引擎,所以访问SQL Server数据库效率会高许多,但只支持SQL Server。后者是比较通用的数据库访问引擎,可以支持广泛的数据库,但效率不如前者。对开发者来说,如果不用到某种数据库的特性,其大体使用方法是一致的。
数据库的连接部分,Connetion对象。提供了与具体数据库的连接方式,具体你是用SqlConnection对象还是OleDbConnection对象。
下面给出两段典型的数据库连接的例子。在此之前,请在程序头部using处添加using System.Data.SqlClient或System.Data.OleDb,以保证数据库访问时用到的命名空间能引用
SQL Server数据访问
string strConn="Integrated Security=SSPI;Initial Catalog=MyDatabase;Data Source=YY-POWERPC ";
SqlConnection myConnection = new SqlConnection (strConn);
myConnection.Open();
OleDb数据访问
String strConn="Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=SSPI";
OleDbConnection myConnection=new OleDbConnection (strConn);
myConnection.Open();
上述步骤执行后,如果没有异常抛出,便可成功完成与数据库的连接。
接下来来完成访问数据库的工作.DataAdapter对象。DataAdapter的工作是后面DataSet的基础,其内容就是建立一个DataSet与数据库的中间层,来协调访问。由于DataAdapter与DataSet的关系十分紧密,我就结合在一起介绍了。DataAdapter也分为SqlDataAdapter和OleDbDataAdatper两种。下面给出一段典型代码(OleDbDataAdapter的情况可类推):
SqlDataAdapter myDataAdapter = new SqlDataAdapter ();
DataSet myDataSet = new DataSet ();
string strCom = "SELECT * FROM 会员信息表";
myDataAdapter.SelectCommand = new SqlCommand (strCom,myConnection);
SqlCommandBuilder myCB = new SqlCommandBuilder (myDataAdapter);
myDataAdapter.Fill (myDataSet,"会员信息表");
这段代码用到了SqlDataAdapter、DataSet、SqlCommand、SqlCommandBuilder四个对象。从上图中可以看出,SqlDataAdapter的作用就是负责与数据库的通讯访问,同时与DataSet相连,它的内部有四个很重要的Command对象(同样分为SqlCommand和OleDbCommand),都是访问数据库必用的,分别为SelectCommand、InsertCommand、UpdateCommand、DeleteCommand对象。这些Command对象便是专门用来完成对数据库的查询、插入、更新、删除操作,它们就像四个大臣,在DataAdapter的控制下分别主管各自的事情。其中SelectCommand是它们四个中的老大,由它可以自动的构造生成另外的三个。构造生成的过程就是应用CommandBuilder。在这之前,我们只需要指定DataAdapter中的SelectCommand对象,就可以了。
在设置好了SQL Select语句后,就可以开始填充相应的数据集了。方法是应用DataAdapter的Fill方法,参数为DataSet及其中的某个DataTable。
DataSet对象。如果你用过ADO中的Recordset对象,你可能会感觉到DataSet和Recordset的差别。Recordset一般只能应用于单表,即一个Recordset对应于一张表。而DataSet中有一个DataTableCollection,即一个DataTable集合,可以包含多个DataTable对象。DataTable对象看上去就更加像一张表了,其中有DataRowCollection、DataColumnCollection、ConstraintCollection。它们分别代表DataRow(数据行)、DataColumn(数据列)、Constraint(约束关系)的对象集合。可能说这么多,你已经有点儿迷糊了,先看一句代码吧。
myDataSet.Tables["MyTable"].Rows[3]["MyName"] = "杨扬";
怎么样?是不是一下子就明白了许多。这是一句多么完美的OO思想表达出的语句啊!这句就是将DataSet下的一个名为MyTable的"虚表"中的第4行的MyName字段的内容改为"杨扬"。为什么叫"虚表"呢?这是因为ADO.NET的一个特点就是脱机连接数据库。这样可以减少网络通讯的压力,提高效率。你可能会问DataColumn在哪呢?Rows[3]就表示了第4行记录,换句话说Rows[3]就是一个DataRow对象,一加上["MyName"]就自动定位到了MyName字段的内容。ADO.NET规定,访问表中内容必须是先行后列的原则,Column["MyName"][3]是不允许的。当然,DataColumn也是什么重要的,比如想查看某列的列头(Field),可以用Column[1].ColumnName更改。