ADO.NET的记忆碎片(四)
上篇 http://www.zzzyk.com/kf/201112/112880.html
DataSet类
DataSet 这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来。DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter 对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet 对象可以说是ADO.NET 中重量级的对象,这个对象架构在DataAdapter 对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter 对象当做DataSet 对象以及数据源间传输数据的桥梁。
创建DataSet对象有两种方式:
1、DataSet ds = new DataSet();
2、DataSet ds = new DataSet("MyDataSet");
第二种方法是加了一个string参数,目的是为新生成的DataSet对象的名称初始化。而第一种生成的DataSet对象是没有名称的。
用前面提到的DataAdapter的Fill()方法为ds创建存储结果的结构:
string strConn ="...";//连接字符串
string strSql = "select * from MytableName1";
SqlDataAdapter da = new SqlDataAdapter(strSql,strConn);
DataSet ds = new DataSet();
da.Fill(ds,"MyTableName");
这个就会让查询结果保存在DataSet对象中的一个名为MyTableName的DataTable对象中。
四个类之间关系
这边先讲一下DataSet、DataTable、DataColumn、DataRow这四个类之间关系。
首先DataSet就是像是一个数据库;DataTable就像是数据库中的一张表;DataColumn就好像是表中的字段的一些信息,如字段名称、类型;DataRow就像是表中的一条记录,而且DataSet数据的访问只可以通过这个row[索引]或者row[字段名称]或者row[DataColumn对象]来获取。那么这几者的关系是:DataSet包含着多个DataTable;DataTable包含着多个DataColumn和多个DataRow,用c#描述是:
DataSet ds = new DataSet("MyDataSet");
List<DataTable> tables = new List<DataTable>();
List<DataColumn> columns = new List<DataColumn>();
List<DataRow> rows = new List<DataRow>();
ds.Tables = tables;
ds.Tables[0].Columns = columns;
ds.Tables[0].Rows = rows;
//ds.Tables[0]表示DataSet数据库中第一张表
再来用文字描述一下: www.zzzyk.com
DataSet对象有一个Tables属性是一个DataTable对象集合,存储这个所有的DataTable对象。
DataTable对象有一个Columns属性是一个DataColumn对象集合,存储这个所有的DataColumn对象。
DataTable对象有一个Rows属性是一个DataRow对象集合,存储这个所有的DataRow对象。
DataRow对象就像是表中的一条记录,而且只要想访问DataSet数据只可以通过这个DataRow对象,方式是:
row[索引]或者row[字段名称]或者row[DataColumn对象]
DataTable对象
这个对象和DataReader对象相似,可以查看查询的结果,结果是作为行和列的集合公开。DataReader是为了性能考虑,只能基于流的方式查看结果集,不能修改数据,也不能返回前一行,提供我们的功能很少。但是DataTable对象有更加强大的功能,可以对数据进行修改、排序、筛选,其中还有两个主要的属性是Columns和Rows。
DataColumn对象
DataColumn对象定义DataTable的架构。在调用DataAdapter的Fill()方法之后,DataAdapter也为查询结果中的每一列创建了一个DataColumn对象,具有Name、Ordinal、DataType这几个基本属性。查看这个几个属性:
string strConn ="...";//连接字符串
string strSql = "select * from MytableName1";
SqlDataAdapter da = new SqlDataAdapter(strSql,strConn);
DataSet ds = new DataSet();
da.Fill(ds,"MyTableName");
foreach(DataColumn col in ds.Tables["MyTableName"].Columns)
{
Console.WriteLine("{0}--{1}",col.ColumnName,col.DataType);
}
DataRow对象
当我们想要查看或者修改DataTable中的数据的时候,我们就必须要用到DataRow对象。遍历DataTable的第一列数据:
foreach(DataRow row in ds.Tables["MyTableName"].Rows)
{
Console.WriteLine("{0}",row[0]);
}
编写一个接受一个row的参数,显示,这一行的列名和值:
static void DisplayRow(DataRow row)
{
foreach(DataColumn col in row.Table.Columns)
{
Console.Write("{0}:{1} ",col.ColumnName,row[col]);
}
}
遍历Table中的所有数据,可以配合使用DisplayRow():
foreach(DataRow row in ds.Tables["MyTableName"].Rows)
{
//显示行号
Console.Write("{0} ",ds.Tables["MyTableName"].Rows.IndexOf(row));
//显示行数据
DisplayRow(row);
Console.WriteLine();//换行
}
到目前为止我们发现我们使用的DataTable对象、DataColumn对象和DataRow对象都是在调用DataAdapter的Fill()方法之后自动生成的,下一讲是:如何自己手动操作这些对象。
作者 八神吻你
补充:Web开发 , ASP.Net ,