zoukankan      html  css  js  c++  java
  • ASP.NET DataTable的操作大全

    DataTable表示一个与内存有关的数据表,可以使用工具栏里面的控件拖放来创建和使用,也可以在编写程序过程中根据需要独立创建和使用,最常见的情况是作为DataSet的成员使用,在这种情况下就需要用在编程过程中根据需要动态创建数据表。那么在8.4节中主要讲用编码的方式来建立DataTable数据表以及对它的操作。

    1 代码创建DataTable数据表

    如上8.3节里面所讲,通过添加对象的方式直接在DataSet中创建数据表,可以通过使用Add方法将DataTable添加到DataSet中,这种是使用控件的可视化添加DataTable的操作,那么在代码中怎么来创建DataTable数据表呢?

    在程序中创建DataTable对象可以使用相应的DataTable构造函数。创建一个表名为TableName的数据表,实现代码如下所示:

    DataTable NewTable = new DataTable(TableName);

    另外也可以通过以下方法创建DataTable对象:使用DataAdapter对象的Fill方法或FillSchema方法在DataSet中创建,这种方式都用于与数据库相连接操作的情况下。实现代码如下所示:

    //数据库联接字符串

    string connectionString =

    "Data Source=local;Initial Catalog=Northwind;Integrated Security=True;UserID=sa;Password=";

    //sql语句查询

    string commandString = "Select * from Customers";

    // 创建SqlDataAdapter对象,并执行sql命令

    SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, connectionString);

    //创建数据集dataSet

    DataSet dataSet = new DataSet();

    //把数据表添加到数据集中

    DataTable dataTable = dataSet.Tables("Customers");

    //将数据填充到数据集中

    dataAdapter.Fill(dataSet,"Customers");

    注意:将一个DataTable作为成员添加到一个DataSet的Tables集合中后,不能再将其添加到任何其他DataSet的表集合中。

    使用DataTable构造函数初次创建DataTable时,是没有架构(即结构,没有列)的。没有架构的DataTable数据表示没有办法使用的,因此要在使用这种DataTable数据表之前要定义表的架构,必须创建DataColumn对象并将其添加到表的Columns集合中。如何使用代码创建Columns列,将在本章后面几节中讲到。

    创建DataTable时,不需要为TableName属性提供值,可以在其他时间指定该属性,或者将其保留为空,这些都不影响DataTable的使用。应该注意的是在将一个没有TableName值的表添加到DataSet中时,该表会得到一个从“Table”(表示Table0)开始递增的默认名称TableN。

    以下示例创建DataTable对象的实例,并为其指定名称“Customers”。 实现代码如下所示:

    DataTable workTable = new DataTable("Customers");

    以下代码是将创建的DataTable实例Customers表添加到DataSet的Tables集合中。实现代码如下所示:

    DataSet customers = new DataSet();

    DataTable customersTable = customers.Tables.Add("CustomersTable");

    或者

    DataSet customers = new DataSet();

    DataTable customersTable = new DataTable(“Customers”)

    customers.Tables.Add(Customers);

    2 用编程方式添加DataTable列

    前面已经学过使用代码创建DataTable,但是使用DataTable构造函数初次创建 DataTable时,是没有架构(即结构,没有列)的。要定义表的架构,必须创建DataColumn 对象并将其添加到表的Columns集合中。也可以为表定义主键列,并且可以创建Constraint约束对象并将其添加到表的Constraints约束集合中。

    DataColumn类型表示了DataTable上的一列。总的来说,绑定到某个DataTable的所有DataColumn类型的集合就表示一个表。

    DataTable包含了由表的Columns属性引用的DataColumn对象的集合。这个列的集合与任何约束一起定义表的架构(即结构)。

    通过使用DataColumn构造函数,或者通过调用表的Columns属性的Add方法,可在表内创建DataColumn对象。Add方法将接受可选的ColumnName、DataType参数,并将创建新的DataColumn作为集合的成员。它还会接受现有的DataColumn对象并会将其添加到集合中,并会根据请求返回对所添加的DataColumn的引用。

    以下示例向DataTable中添加了四列。实现代码如下所示:

    DataTable workTable = new DataTable("Customers");

    DataColumn workCol = workTable.Columns.Add("CustID");

    workTable.Columns.Add("CustLName");

    workTable.Columns.Add("CustFName");

    workTable.Columns.Add("Purchases");

    代码说明:

    q       CustID,CustLName,CustFName,Purchases:数据表Customers中的列名。

    3 设置DataTable数据表的主键

    数据库开发的一个通常规则就是表至少得有一个列作为主键。主键约束用于惟一标识给定表中的一条记录(行)。假设现在需要新建一个DataColumn列来表示EmpID字段并且要将这个列将作为表的主键,它必须有AllowDBNull和Unique属性,实现代码如下所示:

    DataTable workTable = new DataTable("Customers");

    DataColumn workCol = workTable.Columns.Add("CustID", typeof(Int32));

    workCol.AllowDBNull = false;

    workCol.Unique = true;

    workTable.Columns.Add("CustLName", typeof(String));

    workTable.Columns.Add("CustFName", typeof(String)));

    workTable.Columns.Add("Purchases", typeof(String)));

    代码说明:

    示例中用于CustID列的属性设置为不允许DBNull值并将值约束为唯一。但是,如果将CustID列定义为表的主键列,AllowDBNull属性就会自动设置为false,并且Unique属性会自动设置为true。

    4 设置列的数据类型

    通过上面8.4.2节的学习已经知道怎么向新建的数据表中添加列了,那么下面来看一看,怎么为添加的列设置列的数据类型。数据类型是标明一列数据的数据类型属性,根据不同的需要可以在DataTable数据表中建立不同的列,并可以为不同的列设置不同的数据类型,来满足需要。继续上面Customers表的例子,为创建的列添加数据类型:

    实现代码如下所示:

    //创建一个数据表Customers

    DataTable CustomersTable = new DataTable("Customers");

    //创建一个Int32类型名称是CustID列,把这个列设置成主键,并且不允许为空,

    DataColumn CustomersCol = CustomersTable.Columns.Add("CustID", typeof(Int32));

    CustomersCol.AllowDBNull = false;

    CustomersCol.Unique = true;

    //创建三个String类型的列CustLName,CustFName,Purchases

    CustomersTable.Columns.Add("CustLName", typeof(String));

    CustomersTable.Columns.Add("CustFName", typeof(String)));

    CustomersTable.Columns.Add("Purchases", typeof(String)));

    代码说明:

    示例中用于CustID列定义为表的主键列。CustID列指定的数据类型是Int32,CustLName列、CustFName列、Purchases列指定的数据类型都是String的列,当然也可以不设置列的数据类型,在这个时候DataColumn的DataType属性默认为字符串类型,当然可以根据需要在创建列名时进行列数据类型的设置。

    5 启用Autoincrementing字段

    在8.4.4节中学会了如何设置DataColumn列的数据类型,在设置完DataColumn列的数据类型以后,也可以像SQL-Server数据库表一样把某一列设置成自动递增的。简单地说,自动增加列可以确保当一个新行被添加到给定表时,可以基于当前的递增步长值自动指定这个列的值。特别是某一列作为没有重复值得主键的时候,这个功能就特别有用。在DataTable中这个功能可以用AutoIncrement(列是否将列的值自动递增)、AutoIncrementSeed(起始值,种子值)和AutoIncrementStep(步长)属性来控制。

    下面是创建一个支持自动递增的DataColumn列的例子。种子值用于标记列的起始值,步长值表示递增时增加种子值的数值,代码如下所示:

    // 创建一个新列

    DataColumn myColumn = new DataColumn();

    myColumn.ColumnName = " CustID ";

    myColumn.DataType = System.Type.GetType("System.Int32");

     // 设置自动递增

    myColumn.AutoIncrement = true;

    myColumn.AutoIncrementSeed = 0;

    myColumn.AutoIncrementStep = 1;

    代码说明:

    q       AutoIncrement:列是否将列的值自动递增,true表示自动递增,false表示不能自动递增。

    q       AutoIncrementSeed:起始值种子值,AutoIncrement属性设置为true的列的起始值。

    q       AutoIncrementStep:步长,递增量,AutoIncrement属性设置为true的列的步长。

    创建一个数据类型为Int32的CustID列,为了能使这个字段的值实现自动增加的效果,把列AutoIncrement属性设置为true;把列得种子值AutoIncrementSeed定为0,也就是从0开始计数;同时设置自动增加的步长AutoIncrementStep为1,每次增加一个。由于种子值被定为0,前面5个值应该是0、1、2、3和4。

    可以往一个DataTable中添加这个DataColumn来测试一下。然后往这个表中添加一些新行,当然会自动转储CustID列中的值,代码如下所示:

    //实现列自动增加功能

        protected void Button1_Click(object sender, EventArgs e)

        {

            //创建一个新的数据列,名称:CustID ,数据类型:Int32.

            DataColumn myColumn = new DataColumn();

            myColumn.ColumnName = " CustID ";

            myColumn.DataType = System.Type.GetType("System.Int32");

            //把新创建的列设置自动增加,种子为0,增加步长为1.

            myColumn.AutoIncrement = true;

            myColumn.AutoIncrementSeed = 0;

            myColumn.AutoIncrementStep = 1;

            //把这个列添加到Customers表中.

            DataTable CustomersTable = new DataTable("Customers");

            myTable. CustomersTable.Add(myColumn);

            //添加20个新行.

            DataRow r;

            for (int i = 0; i < 20; i++)

            {

                r = CustomersTable.NewRow();

                CustomersTable.Rows.Add(r);

            }

            //显示每一行的数据值.

            string temp = "";

            DataRowCollection rows = CustomersTable.Rows;

            for (int i = 0; i < CustomersTable.Rows.Count; i++)

            {

                DataRow currRow = rows[i];

                temp += currRow["CustID "] + " ";

            }

                //在Label1面显示所有值

            Label1.Text = Label1.Text+temp;

    }

    如果把上面代码写在建立的Web程序中,运行后点击“Button”按钮,就会得出初始值为0的步长为1的一系列数,结果如图:8.4.1所示的显示结果。

    6 用编程方式添加DataTable行

    在为DataTable定义了架构之后,也就是设置好了需要的列名以后,就可以可通过将DataRow对象添加到表的Rows集合中来将数据行添加到表中。与添加DataColumn类似,同样可以通过使用DataRow构造函数,或者通过调用表的Rows属性的Add方法,可在表内创建DataRow对象。

    DataColumn对象集合表示了表的模式(Schema)。DataTable通过内部的DataColumnCollection类型保存表中所有列。相反,DataRow类型集合就表示表中的实际数据。这样,如果Customers表中有10个记录,就可以使用10个DataRow类型来表示它们。使用DataRow类的成员可以对表中的值进行插入、删除、求值和操作操作。

    创建一个DataRow数据行的对象,实现代码如下所示:

    //创建一个Customers数据表

    DataTable CustomersTable = new DataTable("Customers ");

    //创建一个新的数据行

    DataRow arow = CustomersTable.NewRow();

    //设置行的值

    arow[ColumnName] = DataValue;

    //把数据行添加创建的Customers数据表中

    CustomersTable.Rows.Add(arow);

    功能说明:

    新建一行arow, 并给这行某一个列名付值为DataValue,最后把这一行添加到Customers表中。使用DataRow与使用DataColumn有些不同,因为不可以直接创建这个类型的实例,而是获得一个来自给定DataTable的引用。例如,假设想往Customers表中添加新行,DataTable.NewRow()方法可以获得下一空位,然后在上面填充每列的数据。

    实现代码如下所示:

    //创建一个数据表

    DataTable CustomersTable = new DataTable("Customers");

    //声明数据表的行和列变量

    DataColumn column;

    DataRow row;

    //创建一个新列,设置列的数据列性和列名,并把这个新列添加到Customers表中

    column=new DataColumn();

    column.DataType = System.Type.GetType("System.Int32");

    column.ColumnName = " CustID ";

    CustomersTable.Columns.Add(column);

    //再创建一个新列

    column = new DataColumn();

    column.DataType = Type.GetType("System.String");

    column.ColumnName = " CustLName ";

    CustomersTable.Columns.Add(column);

    //创建新的一行并把这个行添加到Customers表中

    for(int i = 0; i < 10; i++)

    {

    row = CustomersTable.NewRow();

    row["CustID "] = i;

    row["CustLName "] = "item " + i.ToString();

    CustomersTable.Rows.Add(row);

    }

    功能说明:

    向CustomersTable表创建两个列分别是CustID, CustLName,然后用循环的方式产生10行并附值,添加到CustomersTable表中。

    7 操作DataTable:更新行

    在前面一节里面讲了,怎么样添加一个DataRow行,那么下面需要了解的关于DataTable的另一个方面就是怎样用新值更新已有的DataRow行。下面开始介绍关于DataTable更新行的问题。

    最常使用的一个方法就是先用Select()方法获得符合给定过滤条件的行。一旦获得这些DataRow,就对它们作相应的修改。例如,假定有一个新按钮在被单击后,搜索DataTable中所有EmployeeID列值为5的行。一旦标识这些项后,就可以把EmployeeID列对应值5改为6。实例代码如下:

    //数据库联接字符串

    string connectionString =

    "Data Source=local;Initial Catalog=Northwind;Integrated Security=True;UserID=sa;Password=";

    //sql语句把Orders表中的数据信息都取出来

    string commandString = "Select * from Orders";

    SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, connectionString);

    DataSet dataSet = new DataSet(  );

    //填充数据集

    dataAdapter.Fill(dataSet," Orders");

    //填充数据表

    DataTable dataTable = dataSet.Tables("Orders");

    // 建立一个用于过滤出EmployeeID列值为5的行的行的变量

    string filterStr = "EmployeeID=5";

    string strEmployeeID = null;

    // 查询出来所有EmployeeID列值为5的行.

    DataRow[] EmployeeID= dataTable.Select(filterStr);

    // EmployeeID列对应值5改为6

    for(int i = 0; i < EmployeeID.Length; i++)

    {

    DataRow temp = EmployeeID [i];

    strEmployeeID += temp["EmployeeID "] = 6;

    EmployeeID [i] = temp;

    }

    8 用编程方式删除DataTable行

    用于从DataTable对象中删除DataRow对象的方法有两种:DataRowCollection对象的 Remove方法和DataRow对象的Delete方法。

    Remove方法和Delete方法都可以将DataTable的行DataRow删除,但是前者是从DataRowCollection中删除DataRow,而后者只将行标记为删除。当应用程序调用AcceptChanges方法时,才会发生实际的删除。通过使用Delete,可以在实际删除之前先以编程方式检查哪些行标记为删除。如果将行标记为删除,其RowState属性会设置为Deleted。

    在将DataSet或DataTable与DataAdapter和关系型数据源一起使用时,用DataRow的 Delete方法移除行。Delete方法只是在DataSet或DataTable中将行标记为Deleted,而不会移除它。而DataAdapter在遇到标记为Deleted的行时,会执行其DeleteCommand方法以在数据源中删除该行。然后,就可以用AcceptChanges方法永久移除该行。如果使用Remove 删除该行,则该行将从表中完全移除,但DataAdapter不会在数据源中删除该行。

    DataRowCollection的Remove方法采用DataRow作为参数,并将其从集合中移除,实现代码如下所示:

    DataTable CustomersTable = new DataTable("Customers ");

    DataRow workRow = empTable.NewRow();

    CustomersTable.Rows.Remove(workRow);

    作为对比,以下示例演示了如何调用DataRow上的Delete方法来将其RowState改为Deleted。实现代码如下所示:

    DataTable CustomersTable = new DataTable("Customers ");

    DataRow workRow = empTable.NewRow();

    workRow.Delete();

    如果将行标记为删除,并且调用DataTable对象的AcceptChanges方法,该行就会从DataTable中移除。相比之下,如果调用RejectChanges,行的RowState就会恢复到被标记为Deleted之前的状态。

    9 向DataTable填充数据

    ADO.NET中的DataSet是数据的内存驻留表示形式,它提供了独立于数据源的一致关系编程模型。DataSet表示整个数据集,其中包含表、约束和表之间的关系。由于DataSet独立于数据源,DataSet可以包含应用程序本地的数据,也可以包含来自多个数据源的数据。与现有数据源的交互通过DataAdapter来控制。

    DataAdapter的SelectCommand属性是一个Command对象,用于从数据源中检索数据。DataAdapter的InsertCommand、UpdateCommand和DeleteCommand属性也是Command对象,用于按照对DataSet中数据的修改来管理对数据源中数据的更新。

    DataAdapter的Fill方法用于使用DataAdapter的SelectCommand的结果来填充DataSet。Fill将要填充的DataSet和DataTable对象(或要使用从SelectCommand中返回的行来填充的DataTable的名称)作为它的参数。

    Fill方法使用DataReader对象来隐式地返回用于在DataSet中创建表的列名称和类型以及用于填充DataSet中的表行的数据。表和列仅在不存在时才创建;否则,Fill将使用现有的DataSet架构。

    以下代码示例使用SqlDataAdapter对象获取Microsoft SQL Server Northwind数据库的数据填充到Customers数据集中的Customers表。

    实现代码如下所示:

    //使用DataAdapter的Fill方法向Customers表中填充数据

    string connectionString =

    "Data Source= local;Initial Catalog=Northwind;Integrated Security=True; UserID=sa;Password=";

    string commandString = "Select * from Customers";

    SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, connectionString);

    DataSet customers = new DataSet();

    dataAdapter.Fill(customers, "Customers");

    10 在DataTable实现类似sql语句的查询功能

    在脱离数据库的DataSet实现类似sql语句的查询。

    也就是(select ... from tablename where ...)这样的功能。

    将从DataSet中查询出来的数据以行的形式保存到arow中。

    实现代码如下所示:

    DataSet ds= new DataSet();

    DataRow[] arow = ds.Tables[TableName].Select("" + ColumnsName+ "=''" + DataValue + "''");

    代码说明:

    qTableName:数据集ds中的表名。

    qColumnsName:TableName表中的某一列名。

    qDataValue:和列名对应参数的值。

    功能说明:

    上面语句功能相当于sql语句中的查询语句

    Select * From TableName where ColumnsName= DataValue

    11  DataTable中数据记录的统计

    在使用数据库时例如SQL-Server、Oracle这些数据库,可以轻松的通过统计和计算函数例如Sum、Aver、Count等统计或计算出相关结果,那么,在已经把数据检索出来的DataTable数据集中能否同样使用呢?在程序中根据需要动态创建的DataTable是没有办法使用sql语句进行查询统计的,例如没有办法使用Select语句来获取查询统计结果。那么在DataTable中怎么来进行统计呢?

        本节将介绍一个简单的方法,可以轻松的获得DataTable中的记录统计结果。这个简单的方法就是调用功能强大的DataTable的函数Compute。

    函数如下:

    public object Compute(string expression,string filter)

    参数说明:

    qexpression 参数需要聚合函数,要计算的表达式字符串,基本上类似于Sql Server中的统计表达式。例如,以下是合法表达式:Count(ID)。

    qfilter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计,也就是确定在表达式中使用哪些行。

        以下示例,以SQL-Server数据库中的Northwind数据库中的Orders数据表,描述订单信息,包含字段为:订单号(OrderID)、客户编号(CustomerID)、职工编号(EmployeeID)、订货时间(OrderDate)、船号(ShipVia)、运费(Freight)。

    1.统计所有职工编号EmployeeID为5的数量:

    table.Compute("Count(*)","EmployeeID=5");

    2.统计所有运费Freight中运费大于100的个数

    table.Compute("Count(*)","Freight>100''");

    3.统计运费Freight的平均值

    table.Compute("Aver(Freight)","true");

    4.统计职工编号EmployeeID为5的运费总额:

    table.Compute("Sum(Freight)"," EmployeeID=5");

    以上都是计算每一列的合计,那么要添加一行求合计可以使用下面的方法:

    //创建一个数据集

    DataSet customers = new DataSet();

    //在数据集中添加一个名称为CustomersTable的数据表

    DataTable customersTable = customers.Tables.Add("CustomersTable");

    //创建一个新行并添加到CustomersTable数据表中

    DataRow dataRow = new DataRow();

    dataRow= customersTable.NewRow();

    //然后就是统计了,声明连个int 变量i:循环变量, colCnt: customersTable表中的列数

    int i ;

    int colCnt ;

    colCnt = customersTable.Cols.Count;

    for( i=0 ;i< colCnt -1;i++)

    //求第i列的和并且结果赋值给新的dataRow数据行

    dataRow(i)= customersTable.Compute("Sum("+i.ToString()+")","true");

    //把数据行添加到customersTable数据表中

    customersTable.Rows.Add(dataRow);

    12 DataTable和xml的一些应用总结

    在ASP.NET2.0中ADO.NET和XML结合的很紧密,第7章中已经详细介绍了在ADO.NET中的数据通过DataSet很容易存取在XML中的,那么在DataTable能像在DataSet中那样操作XML数据文件吗?答案是可以的,下面就是一个将DataTable中的数据写入到XML文件中去的操作,实例代码如下所示:

    //创建一个Customers数据表

    DataTable dt = new DataTable("Customers");

    //添加两列CustID,CustLName数据类型分别为Int32,String,并添加到数据表中

    DataColumn dc1 = new DataColumn("CustID", Type.GetType("System.Int32"));

    DataColumn dc2 = new DataColumn("CustLName", Type.GetType("System.String"));

    dt.Columns.Add(dc1);

    dt.Columns.Add(dc2);

    //利用循环创建数据行并赋值,添加到数据表中

    for (int i = 0; i < al.Count; i++)

    {

    DataRow dr = dt.NewRow();

    DS_Option dso = (DS_Option)al[i];

    dr["CustID"] = dso.ID;

    dr["CustLName"] = dso.Name;

    dt.Rows.Add(dr);

    }

    //将数据表中的数据写入到XML文件中

    string xmlstr;

    System.IO.StringWriter writer = new System.IO.StringWriter();

    dt.WriteXml(writer);

    xmlstr = writer.ToString();

    return xmlstr;

    有了向XML文件写数据的操作,当然也可以从XML文件中读取数据信息到DataTable数据表中,方法累也类似,但要先建立好打DataTable的结构,不然会出错。

    实例代码如下所示:

    string tbxml = xmlinfo;

    DataTable dt = new DataTable("Customers ");

    DataColumn dc1 = new DataColumn("CustID", Type.GetType("System.Int32"));

    DataColumn dc2 = new DataColumn("CustLName", Type.GetType("System.String"));

    dt.Columns.Add(dc1);

    dt.Columns.Add(dc2);

    System.IO.StringReader reader = new System.IO.StringReader(tbxml);

    dt.ReadXml(reader);

  • 相关阅读:
    Chrome cookies folder
    Fat URLs Client Identification
    User Login Client Identification
    Client IP Address Client Identification
    HTTP Headers Client Identification
    The Personal Touch Client Identification 个性化接触 客户识别
    购物车 cookie session
    购物车删除商品,总价变化 innerHTML = ''并没有删除节点,内容仍存在
    453
    购物车-删除单行商品-HTMLTableElement.deleteRow()
  • 原文地址:https://www.cnblogs.com/ayforver/p/3290910.html
Copyright © 2011-2022 走看看