Linq to DataSet 下篇

上篇介绍了使用 Linq 来操纵弱类型的 DataSet ,

而该篇博文则是介绍如何使用 Linq 来操纵强类型的 DataSet,

何为强类型的 DataSet 呢?

其实也就是使用了数据集文件(比如 MyDataSet.xsd) 来生产数据集,

这种情况下的 DataSet 即是强类型,

要想明白强类型的 DataSet ,

那么先还必须了解一下数据集文件是怎么一回事,

image

这就是一个完整的数据集文件,其支持使用 Designer 的方式操纵数据表,

所以可以从服务器资源管理器中拖放几个数据库中的数据表到这个 .xsd 数据集中,

这样便可以得到下图

image

在上面的图中可以一眼看出我往这个数据集文件中拖了两个数据表进去了,

再看一下在拖放数据表的过程中,由 VS 自动生成的代码,

捕获

可以看到,在命名空间 CSharpLanguage 下有一个类 Demo7Use,

然后在 CSharpLanguage.Demo7UseTableAdapters 下有三个类,

一个是 “StudentTableAdapter”,一个是 “作者TableAdapter”

还有一个就是 “TableAdapterManager”

可想而知,设计器为您拖入的每一个数据表都分别建立了一个类,

这个类统一归 CSharpLanguage.Demo7UseTableAdapters 管理,

接下来就看一个使用这个 Demo7Use.xsd 文件的示例

using System;

namespace CSharpLanguage
{
    public partial class Demo__7 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //使用数据集的 Designer 向导来完成数据表的引用,
            //实质上也只是完成了一个类,
            //只不过这个类的完成被 VS 完成了而已
            //而数据集类名则是创建数据集文件时的文件名
            //如果想要使用这个数据集中的内容,
            //那么和使用其他类一样,也需要先进行实例化           
            //所以要先实例化了一个数据集

            Demo7Use ds = new Demo7Use();

            //而这个 Demo7UseTableAdapters 实现了 SqlDataAdapter
            //通过查看 Demo7Use.designer.cs 可以知道
            //VS 会自动生成一个 Demo7UseTableAdapters 类,
            //事实上这个类名是通过你的 数据集文件名和 TableAdapters 组合而成的
            //也就是说,VS 会自动为你的数据集文件中的每一个表都在
            //数据集文件名TableAdapters 下都生成对应的一个 TableAdapter
            //名称也就是 数据表名和 TableAdapter 的组合

            //比如我建立的是一个 Demo7Use.xsd 的数据集文件,
            //所以 TableAdapter 集合的名称会是 Demo7UseTableAdapters
            //而我在这个数据集文件中又拖入了一个 Student 用户表
            //所以在 TableAdapter 集合Demo7UseTableAdapters下就又会有一个
            //StudentTableAdapter
            //事实上,您完全可以把这个 StudentTableAdapter 看做是 SqlDataAdapter
            //只不过这个 StudentTableAdapter 是只属于 Student 这个表的
            //SqlDataAdapter,而SqlDataAdapter则可以对任意表操作

            Demo7UseTableAdapters.StudentTableAdapter studentAdapter =
                 new CSharpLanguage.Demo7UseTableAdapters.StudentTableAdapter();

           //使用只对 Student 表起作用的 SqlDataAdapter--adapter 来填充数据表
            studentAdapter.Fill(ds.Student);

            GridView1.DataSource = ds.Student;
            GridView1.DataBind();

            //然后我又在数据集文件 Demo7Use.xsd 中拖入一个数据表 "作者"
            //此举则会在 "Demo7UseTableAdapters" 集合中生成一个 "作者TableAdapter"
            //由此便可以使用只对 "作者" 表起作用的 SqlDataAdapter
            //来填充数据集 ds 中的 "作者" 表了

            Demo7UseTableAdapters.作者TableAdapter authorAdapter =
                    new CSharpLanguage.Demo7UseTableAdapters.作者TableAdapter();
            authorAdapter.Fill(ds.作者);
            GridView2.DataSource = ds.作者;
            GridView2.DataBind();
        }
    }
}

再看一下上面 Demo 的执行效果

image

上面的 Demo 写了非常详细的注解,不清楚的人一定要注意看注解

介绍完了数据集文件的使用,

下面就该是使用 Linq to DataSet 来操作这个数据集了,

需要提醒的是,

在使用 Linq to DataSet 时,如果 DataSet 是弱类型的话,

一定要让 DataSet 中的 DataTable ,

以实现了 IEnumerable 或者 IEnumerable<T> 接口的对象返回,

而如果 DataSet 是强类型的话,那么久不需要考虑这一点了,

因为

image

image

从上面的两个截图可以看出,若 DataSet 为强类型时,

VS 会自动为数据集文件中拖入的每一个表创建一个单独的类,

并且这个类时继承自 System.Data.TypedTableBase,

而 System.Data.TypedTableBase 这个类本身又是实现了 IEnumerable<T> 接口的,

所以数据集文件中的数据表对象也就间接实现了 IEnumerable<T> 接口,

所以在使用强类型的 DataSet 时可以也就无需考虑这两个接口的问题了

对于 Linq to 强类型 DataSet 的使用,看下面的范例,

其实这个范例和上一个范例除了 Code-Behind 部分,

其他的是一模一样的,因为本身就是在上面的范例上加入 Linq 来完成的 Demo,

using System;
using System.Data;

namespace CSharpLanguage
{
    public partial class Demo__7 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Demo7Use ds = new Demo7Use();
            Demo7UseTableAdapters.StudentTableAdapter studentAdapter =
                    new CSharpLanguage.Demo7UseTableAdapters.StudentTableAdapter();
            studentAdapter.Fill(ds.Student);
            GridView1.DataSource = ds.Student;
            GridView1.DataBind();

            Demo7UseTableAdapters.作者TableAdapter authorAdapter =
                    new CSharpLanguage.Demo7UseTableAdapters.作者TableAdapter();
            authorAdapter.Fill(ds.作者);
            GridView2.DataSource = ds.作者;
            GridView2.DataBind();

            var studentResult = from p in ds.Student
                                select new
                                {
                                    p.身份证号码,
                                    p.学生姓名,
                                    p.性别
                                };
            var authorResult = from p in ds.作者
                               select new
                               {
                                   p.作者代号,
                                   p.作者姓名,
                                   p.性别
                               };

            GridView3.DataSource = studentResult;
            GridView3.DataBind();

            GridView4.DataSource = authorResult;
            GridView4.DataBind();
        }
    }
}

而后就是看一下执行的结果了

image

image

以上就是整个的一个完整的范例了,

有些部分的注解各位需要好好斟酌。

                                                   2010—2—01

 

posted @ 2010-03-01 13:20  小宝马的爸爸  阅读(1016)  评论(0编辑  收藏  举报