使用数据集和数据适配器
数据集的构造函数是重载的
DataSet ds =new DataSet();
DataSet ds =new DataSet("MyDataSet");
如果使用无参数的构造函数,数据库的名称就默认为NewDataSet,如果需要多个数据集,最好使用另一个构造函数,并显式地命名它。但总是可以使用DataSetName属性改变数据集的名称。
填充数据集有两种方式:
1、使用数据适配器
2、从XML文档中读取数据
用数据适配器填充数据集实例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; namespace PopDataSet { class Program { static void Main(string[] args) { string connString = @" server = .; integrated security =true; database =northwind"; string sql = @"select productname,unitprice from products where unitprice <20"; SqlConnection conn = new SqlConnection(connString); try { conn.Open(); SqlDataAdapter da = new SqlDataAdapter(sql, conn); DataSet ds = new DataSet(); da.Fill(ds, "products"); DataTable dt = ds.Tables["products"]; foreach (DataRow row in dt.Rows) { foreach (DataColumn col in dt.Columns) Console.WriteLine(row[col]); Console.WriteLine("".PadLeft(20, '=')); } } catch (SqlException e) { Console.WriteLine("Error :" + e.ToString()); } finally { conn.Close(); } Console.ReadKey(); } } }
示例说明:
定义查询并打开连接后,就创建和初始化数据适配器:
SqlDataAdapter da =new SqlDataAdapter(sql,conn);
接着创建数据集:
DataSet ds =new DataSet();
此时,得到的只是空数据集。关键的代码是使用数据适配器的Fill方法来执行查询,检索数据,以及填充数据集:
da.Fill(ds,"products");
Fill方法在内部使用数据读取器来访问表模式和数据,然后使用它们填充数据集。如果未在Fill方法中给表提供名称,表将自动命名为TableN,其中N以空字符串开始(第一个表的名称是Table),每次在DataSet中插入新表时都对其加1,因而,建议显式给数据表命名。
如果在已包含数据的数据库上多次执行相同的查询,Fill()方法就会更新数据,并跳过根据模式重新定义表的过程。
注意,下面的代码生成相同的结果。这里不是把SQL和连接传送给数据适配器的构造函数,而是用一个命令设置它的SelectCommand属性,该命令是用相应的SQL和连接创建的。
//Create data adapter
SqlDataAdapter da =new SqlDataAdapter();
da.SelectCommand=new SqlCommand(sql,conn);
有了已填充数据的数据集后,就可以访问DataTable对象中的数据,这个数据集当前只含有一个表:
DataTable dt=ds.Tables["products"];
最后,使用嵌套的foreach循环,访问每一行的列,并且把它们的数据值输出到屏幕上:
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn col in dt.Columns)
Console.WriteLine(row[col]);
Console.WriteLine("".PadLeft(20, '='));
}