首页  :: 新随笔  :: 联系 :: 管理

AOD.NET笔记之DataApater

Posted on 2007-03-27 09:50  Fulcrum-A  阅读(756)  评论(2编辑  收藏  举报

 

Dataadapter专门是为了处理脱机数据而设计的。

查询过程中,Dataadapter会使用一个command(selectcommand)来数据库进行通信。同时,其也隐性的使用的datareader来获取结果,然后将查询的结果复制到DATASET的新行中去。


Dataadapter
的构造函数:

(1)
SqlConnection con=new SqlConnection();
            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 conStr = "Data Source=SNOWWIND;Initial Catalog=Northwind;User ID=sa;Password=sa";
            
string cmdStr = "SELECT * FROM CUSTOMERS";
            SqlDataAdapter apa 
= new SqlDataAdapter(cmdStr, conStr);

(3)
SqlConnection con = new SqlConnection();
            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对象

SqlConnection con = new SqlConnection();
            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对象

SqlConnection con = new SqlConnection();
            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

SqlConnection con = new SqlConnection();
            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行填充到数据集 

SqlConnection con = new SqlConnection();
        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, 
05"customtersTable");


(5)fill(int32,int32,datatable[])
在 DataTable 中添加或刷新行以匹配使用 DataTable 名称、指定的 SQL SELECT 语句和 CommandBehavior 的数据源中的行。
此方法在 .NET Framework 2.0 版中是新增的。



多次调用fill方法
在调用FILL方法钱如果未打开数据库连接,dataadapter会自动打开一个连接,查询数据库并将结果导入dataset,最后关闭连接。但如果在fill方法前显式的打开了数据库连接,那么在操作后连接仍然将保持开放的状态。
每调用一次fill或update方法数据库就会被自动打开并关闭一次,因此在有数个此操作时建议是显式的打开和关闭connection。

using (SqlConnection con = new SqlConnection())
        
{
            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清空。
using (SqlConnection con = new SqlConnection())
        
{
            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”;

using (SqlConnection con = new SqlConnection())
        
{
            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属性来开关数据约束检查。

 

  using (SqlConnection con = new SqlConnection())
        
{
            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();
        }