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


    使用DataTable类的搜索和筛选功能
    DataTable类公开了两个方法:Find和Select
    Find方法:可以根据主键来查找数据行。Select方法:更类似于筛选器,根据更灵活的搜索条件返回多个数据行
    在查询数据库获取信息时,假如使用如下SQL查询:
         select CustomerID,CompanyName,ContactName,Phone from Customers where CustomerID = 'Alen'
    这个查询是根据主键来查询的,可以在ADO.NET中使用Find方法,根据主键值在DataTable中查找DataRow。
    Find方法返回一个DataRow,就算有多个DataRow符合查询的要求,也只会返回第一个符合要求的DataRow。
    使用示类:

    string strConn, strSQL;//数据库连接字符串,和查询语句
    strConn = "....";
    strSQL = "....";
    SqlDataAdapter da = new SqlDataAdapter(strSQL,strConn);
    DataTable tb1 = new DataTable("Customers");
    da.Fill(tb1);
    tb1.PrimaryKey = new DataColumn[] { tb1.Columns["CustomerID"] };
    DataRow row = tb1.Rows.Find("Alen");
    Console.WriteLine(row["CompanyName"]);

    DataTable类的Select方法根据类似的条件查找行。
    假如希望查找下面SQL语句:
         select CustomerID,CompanyName,ContactName,Phone from Customers where Country = 'USA' and City <> 'Seattle'
    这个复杂的条件查询,我们要是假设DataTable中数据也是要完成这样的查询,可以使用Select方法来完成,使用实例:

    SqlDataAdapter da1 = new SqlDataAdapter(strSQL, strConn);
    DataTable tb2 = new DataTable("Customers");
    da.Fill(tb1);
    string strFilter = "Country = 'USA' and City <> 'Seattle'";
    foreach (DataRow r in tb2.Select(strFilter))
    {
        Console.WriteLine(r["CompanyName"]);
    }

    可以看出来select方法还是很重要的,我们来做个select的用法步骤归纳:
    1、先确定要筛选的目标结果
    2、写出对应的SQL语句,能在数据库中运行,并得到想要的结果
    3、把这个表的数据,用SqlDataAdapter的Fill方法缓存到内存的DataTable中
    4、把SQL语句的Where部分提取出来赋值给strFilter字符串
    5、调用Select方法:DataRow[] = tb2.Select(strFilter);会返回相应的结果集

     *有时候我们需要对结果排序,用SQL语句就很简单:
     *升序:
     *select CustomerID,CompanyName,ContactName,Phone from Customers order by City
     *降序:
     *select CustomerID,CompanyName,ContactName,Phone from Customers order by City desc
     *重载的Select方法可以接受一个排序顺序,使用实例: 

    string strFilter1 = "Country = 'USA' and City <> 'Seattle'";
    string strSort = "City Desc";
    foreach (DataRow r in tb2.Select(strFilter1, strSort))
    {
        Console.WriteLine(r["CompanyName"]);
    }

     我们来做个select的用法步骤重新总结:
    1、先确定要筛选的目标结果
    2、写出对应的SQL语句,能在数据库中运行,并得到想要的结果
    3、把这个表的数据,用SqlDataAdapter的Fill方法缓存到内存的DataTable中
    4、把SQL语句的Where部分提取出来赋值给strFilter字符串,Order by部分提取出来给strSort字符串
    5、调用Select方法:DataRow[] = tb2.Select(strFilter, strSort);会返回相应的结果集

    DataView对象的出现
    DataTable的Select方法功能强大而且很灵活,但是它还是有一些限制。
    首先,这个动态的查询效率不高。然后Windows和Web不支持绑定到DataRow数组。
    于是DataView对象出现了,可以很好的解决这些限制
    DataView对象从DataTable中返回数据,数据库中的视图也是这个特性
    DataView对象可以用来筛选、排序和搜索DataTable的数据,但是他们并非SQL查询。
    不能用DataView来连接两个DataTable对象之间的数据。
    DataView对象的确支持根据动态的条件筛选行,但是他们仅能访问一个DataTable,并且DataTable中的所有列都可以通过DataView得到
    创建DataView对象
    使用DataView来查看DataTable中的数据就必须将他和DataTable对象关联起来,有以下两个方法:

    DataTable tb3 = new DataTable("Customers");
    DataView vue;

    //方法1,使用这个方法要注意一个问题,所关联的tb3的TableName必须是自己重新指定的,默认是不行的
    vue = new DataView();
    vue.Table = tb3;
    //方法2
    vue = new DataView(tb3);

    DataView对象还有一个构造函数,其签名与DataTable对象的Select方法非常匹配,
    一个复杂的构造函数在一行代码中设置了DataView的Table、RowFilter、Sort和RowStateFilter等属性
    使用实例:

    //分别设置Table、RowFilter、Sort和RowStateFilter等属性
    vue.Table = tb3;
    vue.RowFilter = strFilter1;
    vue.Sort = strSort;
    vue.RowStateFilter = DataViewRowState.ModifiedCurrent;

    //一个复杂的构造函数
    vue = new DataView(tb3, strFilter1, strSort,DataViewRowState.ModifiedCurrent);

    使用DataRowView来查看DataView中的数据
    DataView对象还公开了Count属性,可以看到DataView的行数
    使用实例:

    foreach (DataRowView rView in vue)
    {
        Console.WriteLine(rView["CompanyName"]);
    }

    在DataView中搜索数据
    我们前面已经使用了RowFilter和RowStateFilter属性来支持搜索的,DataView还支持Find和FindRows方法搜索
    Find方法使用说明:一旦设置了DataView中的Sort属性,就可以调用它的Find方法,根据Sort属性中所指示的列来查找。
    DataView的Find方法不返回DataRow或者是DataRowView对象,他会返回的是一个整型值,该值是对应于所在行的DataView的索引。如果没有就返回-1
    Find方法使用实例:

    vue = new DataView(tb3);
    vue.Sort = "City";
    int intIndex = vue.Find("Fran Wilson");
    Console.WriteLine(vue[intIndex]["CompanyName"]);
    //使用FindRows方法
    vue = new DataView(tb3);
    vue.Sort = "City";
    DataRowView[] arows = vue.FindRows("Fran");
    foreach (DataRowView rr in arows)
    {
        Console.WriteLine(rr["CompanyName"]);
    }

    修改DataRowView对象
    用DataRowView对象修改一行数据类似于修改DataRow对象的内容。与DataRow类一样,DataRowView对象也公开了BeginEdit,EndEdit,CancelEdit
    和Delete方法,用DataRowView对象创建新数据行与创建新DataRow有一点不同。DataView有一个AddNew方法,该方法返回一个新的DataRowView
    直到DataRowView对象调用EndEdit方法,新行才被真正地创建到DataTable中,使用实例:

    //添加一新行
    DataRowView rowView = vue.AddNew();
    rowView["CustomerID"] = "asdf";
    rowView.EndEdit();
    //修改一行
    rowView.BeginEdit();
    rowView["CustomerID"] = "刘明丰";
    rowView.EndEdit();
    //删除一行
    rowView.Delete();

    使用DataView创建新的DataTable
    使用实例

    DataTable newTable = vue.ToTable("CreateNewTable");

  • 相关阅读:
    oracle(Xe)数据库远程连接需修改配置参数
    oracl 权限循环查询
    控件网站
    java常用类(1)
    关于webdriver和谷歌浏览器的那些事
    2020年第27周,24.75h,完成计算智能/物联网/数据挖掘大作业
    2020年第26周,24.75h,计算智能的大小作业
    2020年第25周,25.5h,随机过程考试、report和计算智能作业
    2020年24周,11.75h,以完成作业和考试为主,看了一点点论文
    2020年第23周,11h,努力完成课程作业
  • 原文地址:https://www.cnblogs.com/lmfeng/p/2335876.html
Copyright © 2020-2023  润新知