http://www.cnblogs.com/fulcrum-a/archive/2007/03/27/689507.html
Dataadapter专门是为了处理脱机数据而设计的。
查询过程中,Dataadapter会使用一个command(selectcommand)来数据库进行通信。同时,其也隐性的使用的datareader来获取结果,然后将查询的结果复制到DATASET的新行中去。
Dataadapter的构造函数:
(1)
con.ConnectionString = " Data Source=SNOWWIND;Initial Catalog=Northwind;User ID=sa;Password=sa " ;
string cmdStr = " SELECT * FROM CUSTOMERS " ;
SqlDataAdapter apa = new SqlDataAdapter(cmdStr, con);
(2)
string cmdStr = " SELECT * FROM CUSTOMERS " ;
SqlDataAdapter apa = new SqlDataAdapter(cmdStr, conStr);
(3)
con.ConnectionString = " Data Source=SNOWWIND;Initial Catalog=Northwind;User ID=sa;Password=sa " ;
SqlCommand cmd = new SqlCommand();
cmd.CommandText = " SELECT * FROM CUSTOMERS " ;
cmd.Connection = con;
SqlDataAdapter apa = new SqlDataAdapter(cmd);
其中第二中方式一般是不予以推荐的,此方法会每个dataadapter创建一个connection对象,如果要使用多个dataadapter对象的话会浪费服务器的资源。一、三方法能够保证不同的dataadapter使用的相同的connection对象。
DataAapater的Fill方法:
重载的方法:
(1)填充到dataset对象
con.ConnectionString = " Data Source=SNOWWIND;Initial Catalog=Northwind;User ID=sa;Password=sa " ;
string cmdStr = " SELECT * FROM CUSTOMERS " ;
SqlDataAdapter apa = new SqlDataAdapter(cmdStr, con);
DataSet ds = new DataSet();
apa.Fill(ds);
(2)填充一个datatable对象
con.ConnectionString = " Data Source=SNOWWIND;Initial Catalog=Northwind;User ID=sa;Password=sa " ;
string cmdStr = " SELECT * FROM CUSTOMERS " ;
SqlDataAdapter apa = new SqlDataAdapter(cmdStr, con);
DataTable myTable = new DataTable();
apa.Fill(myTable);
(3)填充dataset对象,并将customers表映射为表customtersTable
con.ConnectionString = " Data Source=SNOWWIND;Initial Catalog=Northwind;User ID=sa;Password=sa " ;
string cmdStr = " SELECT * FROM CUSTOMERS " ;
SqlDataAdapter apa = new SqlDataAdapter(cmdStr, con);
DataSet ds = new DataSet();
apa.Fill(ds, " customtersTable " );
(4)只将查询结果的0-5行填充到数据集
con.ConnectionString = " Data Source=SNOWWIND;Initial Catalog=Northwind;User ID=sa;Password=sa " ;
string cmdStr = " SELECT * FROM CUSTOMERS " ;
SqlDataAdapter apa = new SqlDataAdapter(cmdStr, con);
DataSet ds = new DataSet();
apa.Fill(ds, 0 , 5 , " customtersTable " );
(5)fill(int32,int32,datatable[])
在 DataTable 中添加或刷新行以匹配使用 DataTable 名称、指定的 SQL SELECT 语句和 CommandBehavior 的数据源中的行。
此方法在 .NET Framework 2.0 版中是新增的。
多次调用fill方法
在调用FILL方法钱如果未打开数据库连接,dataadapter会自动打开一个连接,查询数据库并将结果导入dataset,最后关闭连接。但如果在fill方法前显式的打开了数据库连接,那么在操作后连接仍然将保持开放的状态。
每调用一次fill或update方法数据库就会被自动打开并关闭一次,因此在有数个此操作时建议是显式的打开和关闭connection。
{
con.ConnectionString = "Data Source=localhost;User ID=sa;Password=sa;database=demoDb";
string cmdStr = "SELECT * FROM userTable";
SqlDataAdapter apa = new SqlDataAdapter(cmdStr, con);
DataSet ds = new DataSet();
con.Open();
apa.Fill(ds, "myTable");
apa.Fill(ds, "myTable");
con.Close();
GridView1.DataSource = ds.Tables["myTable"];
GridView1.DataBind();
}
上面例子中,2次调用fill方法,一次将查询数据填充到dataset的myTable表中,第二次同样的数据也填充到了dataset的 myTable表中,造成了数据的冗余。可以在datatable中使用primarykey属性,就可以筛选出重复的行,但这样还是有缺陷,因为这样做 是覆盖了以第二次查询数据来覆盖,如果一条记录在第一次查询中出现,在第二次查询前被删除,那么第二次查询不会对dataset中的这条脏数据进行操作。 因此在再次填充前应该将dataset或datatable清空。
{
con.ConnectionString = "Data Source=localhost;User ID=sa;Password=sa;database=demoDb";
string cmdStr = "SELECT * FROM userTable";
SqlDataAdapter apa = new SqlDataAdapter(cmdStr, con);
DataSet ds = new DataSet();
con.Open();
apa.Fill(ds, "myTable");
if (ds!= null)
{
ds.Clear();
}
apa.Fill(ds, "myTable");
con.Close();
GridView1.DataSource = ds.Tables["myTable"];
GridView1.DataBind();
}
将查询结果映射到dataset中以及处理批查询
TableMapping集合控制着dataapater将dataset映射到数据库的方式。
如果将一个dataapater的tablemapping集合保留是空,调用方法,然后将dataset作为参数并且不指定表名称,dataapater会将datatable的名称依次默认为”Table、Table1、Table2”;
{
con.ConnectionString = "Data Source=localhost;User ID=sa;Password=sa;database=demoDb";
string cmdStr = "SELECT * FROM userTable;SELECT * FROM COUNTRYTABLE";//简单的批查询
SqlDataAdapter apa = new SqlDataAdapter(cmdStr, con);
DataTableMapping tbMap;
DataTableMapping tbMap1;
tbMap = apa.TableMappings.Add("Table", "users");//表映射
tbMap.ColumnMappings.Add("userId","ID num");
tbMap.ColumnMappings.Add("userName","Name");//列映射
tbMap1 = apa.TableMappings.Add("Table1", "countries");//表映射
tbMap1.ColumnMappings.Add("countryId", "C Num");
tbMap1.ColumnMappings.Add("countryName", "Name");//列映射
DataSet ds = new DataSet();
apa.Fill(ds);
GridView1.DataSource = ds.Tables["users"];
GridView1.DataBind();
GridView2.DataSource = ds.Tables["countries"];
GridView2.DataBind();
}
关于DATATABLE的性能:
1) 当系统从数据库中获取数据并填充到datatable中时,或自动根据其约束来验证每一行(比如主键、唯约束等等),这样是以牺牲系统性能为代价的。既然 是从关系数据库中提取出来的数据,那么对数据约束的检查应该丢给它来做。在填充数据集前可以利用dataset的EnforceConstraints属 性来开关数据约束检查。
{
con.ConnectionString = "Data Source=localhost;User ID=sa;Password=sa;database=demoDb";
string cmdStr = "SELECT * FROM userTable;";
SqlDataAdapter apa = new SqlDataAdapter(cmdStr, con);
DataSet ds = new DataSet();
ds.EnforceConstraints = false;//关闭数据约束检查
apa.Fill(ds,"users");//(2)一般情况下,手动的创建数据表比让fill或fillschema来自动创建快很多
ds.EnforceConstraints = true;//打开数据约束检查
GridView1.DataSource = ds.Tables["users"];
GridView1.DataBind();
}