AOD.NET笔记之DataApater

http://www.cnblogs.com/fulcrum-a/archive/2007/03/27/689507.html

 

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, 
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。

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();
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值