数据集的筛选和排序
动态筛选和排序数据集中的数据
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; namespace FilterSort { class Program { static void Main(string[] args) { string connString = @" server = .; integrated security =true; database =northwind"; string sql1 = @"select * from customers"; string sql2 = @" select * from products where unitprice<10"; string sql = sql1 + sql2; SqlConnection conn = new SqlConnection(connString); try { conn.Open(); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = new SqlCommand(sql, conn); DataSet ds = new DataSet(); da.Fill(ds, "customers"); DataTableCollection dtc = ds.Tables; Console.WriteLine("Results from Customers table:"); Console.WriteLine("CompanyName".PadRight(20) + "ContactName".PadLeft(23) + "\n"); string f1 = "country = 'Germany'"; string srt = "companyname desc"; foreach (DataRow row in dtc["customers"].Select(f1, srt)) { Console.WriteLine("{0}\t{1}",row["CompanyName"].ToString().PadRight(25),row["ContactName"]); } Console.WriteLine("\n------------------------------------------"); Console.WriteLine("Results from Products table:"); Console.WriteLine("ProductName".PadRight(20)+"UnitPrice".PadLeft(21)+"\n"); foreach(DataRow row in dtc[1].Rows) { Console.WriteLine("{0}\t{1}",row["productname"].ToString().PadRight(25),row["unitprice"]); } } catch (SqlException e) { Console.WriteLine("Error :{0}", e.ToString()); } finally { conn.Close(); } Console.ReadKey(); } } }
示例说明:
本例中编写了两个查询,合并起来后,创建连接。
先创建数据适配器,再把数据适配器的SelectCommand属性赋予封装了查询和连接的命令。
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(sql, conn);
接着创建和填充数据集
DataSet ds = new DataSet();
da.Fill(ds, "customers");
每个查询都返回一个结果集,每个结果集都存储在单独的DataTable对象中,第一个表显式地命名为customers,第二个表使用默认名称customers1.
从数据集的Tables属性中获取DataTable对象集合,以便于以后的引用
DataTableCollection dtc = ds.Tables;
使用foreach循环, 给数据表的Select方法传送筛选和排序字符串,显示从表中选出的行。这个表就是DataTable对象集合中的customers表
foreach (DataRow row in dtc["customers"].Select(f1,srt))
{
Console.WriteLine("{0}\t{1}",row["CompanyName"].ToString().PadRight(25),row["ContactName"]);
}
使用创建数据集时定义的表名,从表集合(dtc对象)中获得对单个DataTable对象的引用,重载的Select方法在DataTable上进行内部搜索,去除不满足选择条件的行,以规定的顺序对结果排序,最后返回DataRow的数组。在索引器中使用列名,就可以访问行中的每一列。
注意,如果对customer数据使用另一个查询,就可以得到相同的结果,而且效率高得多。
提示:一般情况下,应尽可能利用SQL从数据库中获取需要的数据,而不是编写C#过程来实现。数据库服务器对数据的选择和排序等操作进行了优化。查询功能也比本章列出的查询复杂,强大得多,在编写查询,返回需要的数据时要特别小心,不仅应使资源要求降到最低,也要减少用于处理和格式化结果集数据所需的代码。
第二个表没有被重命名(没有使用customers1),使用了序数索引:
foreach(DataRow row in dtc[1].Rows)