zoukankan      html  css  js  c++  java
  • DateTable全解

            public DataTable GetTable(DataRow[] drows)
            {

                DataTable tempT = new DataTable();
                if (drows.Length == 0) return tempT;
                tempT = drows[0].Table.Clone();//克隆表结构
                DataSet tempDs = new DataSet();
                tempDs.Tables.Add(tempT);//添加到辅助数据集中
                tempDs.Merge(drows);//利用数据集合并行集到表
                return tempDs.Tables[0];//返回此表

            }

    在为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] = Data;

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

    CustomersTable.Rows.Add(arow);

    功能说明:

    新建一行arow, 并给这行某一个列名付值为Data,最后把这一行添加到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表中。

    8.4.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.4.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之前的状态。

    8.4.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对象获取MicrosoftSQL 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");

    8.4.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表中的某一列名。

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

    功能说明:

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

    Select * From TableName where ColumnsName= Data

    8.4.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);

    8.4.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);

    DataTable添加列和行的方法

    C#  
    方法一:

    DataTable tblDatas = newDataTable("Datas");
    DataColumn dc = null;

    //赋值给dc,是便于对每一个datacolumn的操作
    dc =tblDatas.Columns.Add("ID",Type.GetType("System.Int32"));
    dc.AutoIncrement= true;//自动增加
    dc.AutoIncrementSeed = 1;//起始为1
    dc.AutoIncrementStep = 1;//步长为1
    dc.AllowDBNull = false;//

    dc = tblDatas.Columns.Add("Product",Type.GetType("System.String"));
    dc = tblDatas.Columns.Add("Version",Type.GetType("System.String"));
    dc = tblDatas.Columns.Add("Description",Type.GetType("System.String"));

    DataRow newRow;
    newRow = tblDatas.NewRow();
    newRow["Product"] = "大话西游";
    newRow["Version"] = "2.0";
    newRow["Description"] = "我很喜欢";
    tblDatas.Rows.Add(newRow);

    newRow = tblDatas.NewRow();
    newRow["Product"] = "梦幻西游";
    newRow["Version"] = "3.0";
    newRow["Description"] = "比大话更幼稚";
    tblDatas.Rows.Add(newRow);

    方法二:

     DataTable tblDatas = newDataTable("Datas");
    tblDatas.Columns.Add("ID", Type.GetType("System.Int32"));
    tblDatas.Columns[0].AutoIncrement = true;
    tblDatas.Columns[0].AutoIncrementSeed = 1;
    tblDatas.Columns[0].AutoIncrementStep = 1;

    tblDatas.Columns.Add("Product",Type.GetType("System.String"));
    tblDatas.Columns.Add("Version",Type.GetType("System.String"));
    tblDatas.Columns.Add("Description",Type.GetType("System.String"));

    tblDatas.Rows.Add(newobject[]{null,"a","b","c"});
    tblDatas.Rows.Add(newobject[] { null, "a", "b", "c" });
    tblDatas.Rows.Add(new object[] { null, "a", "b", "c" });
    tblDatas.Rows.Add(new object[] { null, "a", "b", "c" });
    tblDatas.Rows.Add(new object[] { null, "a", "b", "c" });

    方法三:
    DataTable table = new DataTable ();

     //创建table的第一列
    DataColumn priceColumn = new DataColumn();
    //该列的数据类型
    priceColumn.DataType = System.Type.GetType("System.Decimal");
    //该列得名称
     priceColumn.ColumnName = "price";
     //该列得默认值
    priceColumn.DefaultValue =50;

    // 创建table的第二列
    DataColumn taxColumn = new DataColumn();
    taxColumn.DataType = System.Type.GetType("System.Decimal");
     //列名
    taxColumn.ColumnName = "tax";
    //设置该列得表达式,用于计算列中的值或创建聚合列
    taxColumn.expression_r_r = "price *0.0862";
    //
    Create third column.
    DataColumn totalColumn = new DataColumn();
    totalColumn.DataType = System.Type.GetType("System.Decimal");
    totalColumn.ColumnName = "total";
    //该列的表达式,值是得到的是第一列和第二列值得和
    totalColumn.expression_r_r = "price + tax";

    // 将所有的列添加到table上
    table.Columns.Add(priceColumn);
    table.Columns.Add(taxColumn);
    table.Columns.Add(totalColumn);

    //创建一行
     DataRow row = table.NewRow();
     //将此行添加到table中
    table.Rows.Add(row);

    //将table放在试图中
     DataViewview = new DataView(table);
    dg.DataSource = view;

    dg.DataBind();

    DataTable 修改列名 删除列名 调整列名 列顺序

    DataTable myDt =dt;
    myDt.Columns.Remove("minArea");//删除列名
    myDt.Columns.Remove("maxArea");  
    myDt.Columns["num"].SetOrdinal(1);//调整列名
    dt.Columns["name"].ColumnName = "面积范围(平米)";
    dt.Columns["num"].ColumnName = "搜索量";
    dt.Columns["rate"].ColumnName = "百分比";//修改列名
  • 相关阅读:
    sqlISNULL函数(转载)
    sql数据导入导出(转载)
    sqlbcp
    SQL连接方式(左连接、右连接、全连接)转载
    陶哲轩实分析 习题 7.2.6 (嵌套级数)
    陶哲轩实分析 命题7.2.5 证明
    陶哲轩实分析 定义 7.2.1(形式无限级数) 的一点注记
    陶哲轩实分析 推论 7.3.2 (比较判别法) 证明
    陶哲轩实分析 习题 7.2.6 (嵌套级数)
    陶哲轩实分析 命题 7.2.14 (极限算律) 证明
  • 原文地址:https://www.cnblogs.com/zlf344242525/p/2270653.html
Copyright © 2011-2022 走看看