• ADO.NET的记忆碎片(四)


    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数据库中第一张表

    再来用文字描述一下:
    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()方法之后自动生成的,下一讲是:如何自己手动操作这些对象。



  • 相关阅读:
    P3015 [USACO11FEB]最好的括号Best Parenthesis
    P1944 最长括号匹配_NOI导刊2009提高(1)
    P2328 [SCOI2005]超级格雷码
    P2308 添加括号
    P5657 格雷码【民间数据】
    P2196 挖地雷
    P5020 货币系统
    括号序列模型--序列dp--U86873 小Y的精灵国机房之旅
    P1033 自由落体
    P1017 进制转换
  • 原文地址:https://www.cnblogs.com/lmfeng/p/2280306.html
Copyright © 2020-2023  润新知