Datatable表示一个与内存有关的数据表,可以使用工具栏里面的控件拖放来创建和使用,也可以在编写程序过程中根据需要独立创建和使用,最常见的情况是作为DataSet的成员使用,在这种情况下就需要用在编程过程中根据需要动态创建数据表。
1 代码创建Datatable数据表
通过添加对象的方式直接在DataSet中创建数据表,可以通过使用Add方法将Datatable添加到DataSet中,这种是使用控件的可视化添加Datatable的 *** 作,那么在代码中怎么来创建Datatable数据表呢?
在程序中创建Datatable对象可以使用相应的Datatable构造函数。创建一个表名为tablename的数据表,实现代码如下所示:
@H_404_26@Datatable Newtable = new Datatable(tablename);
另外也可以通过以下方法创建Datatable对象:使用DataAdapter对象的Fill方法或FillSchema方法在DataSet中创建,这种方式都用于与数据库相连接 *** 作的情况下。实现代码如下所示:
@H_404_26@//数据库联接字符串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);//创建数据集dataSetDataSet 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”。 实现代码如下所示:
@H_404_26@Datatable worktable = new Datatable("Customers");以下代码是将创建的Datatable实例Customers表添加到DataSet的tables集合中。实现代码如下所示:
@H_404_26@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表的例子,为创建的列添加数据类型:
实现代码如下所示:
//创建一个数据表CustomersDatatable Customerstable = new Datatable("Customers");//创建一个Int32类型名称是CustID列,把这个列设置成主键,并且不允许为空,DataColumn CustomersCol = Customerstable.Columns.Add("CustID",typeof(Int32));CustomersCol.Allowdbnull = false;CustomersCol.Unique = true;//创建三个String类型的列CustLname,CustFname,PurchasesCustomerstable.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列的例子。种子值用于标记列的起始值,步长值表示递增时增加种子值的数值,代码如下所示:
@H_404_26@// 创建一个新列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列中的值,代码如下所示:
@H_404_26@//实现列自动增加功能 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;}6 用编程方式添加Datatable行
在为Datatable定义了架构之后,也就是设置好了需要的列名以后,就可以可通过将DaTarow对象添加到表的Rows集合中来将数据行添加到表中。与添加DataColumn类似,同样可以通过使用DaTarow构造函数,或者通过调用表的Rows属性的Add方法,可在表内创建DaTarow对象。
DataColumn对象集合表示了表的模式(Schema)。Datatable通过内部的DataColumnCollection类型保存表中所有列。相反,DaTarow类型集合就表示表中的实际数据。这样,如果Customers表中有10个记录,就可以使用10个DaTarow类型来表示它们。使用DaTarow类的成员可以对表中的值进行插入、删除、求值和 *** 作 *** 作。
创建一个DaTarow数据行的对象,实现代码如下所示:
@H_404_26@//创建一个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()方法可以获得下一空位,然后在上面填充每列的数据。
实现代码如下所示:
@H_404_26@//创建一个数据表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。实例代码如下:
@H_404_26@//数据库联接字符串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改为6for(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作为参数,并将其从集合中移除,实现代码如下所示:
@H_404_26@Datatable Customerstable = new Datatable("Customers ");DaTarow workRow = emptable.NewRow();Customerstable.Rows.Remove(workRow);作为对比,以下示例演示了如何调用DaTarow上的Delete方法来将其RowState改为Deleted。实现代码如下所示:
@H_404_26@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。
@H_404_26@函数如下:public object Compute(string Expression,string filter)参数说明:qExpression 参数需要聚合函数,要计算的表达式字符串,基本上类似于sql Server中的统计表达式。例如,以下是合法表达式:Count(ID)。qfilter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计,也就是确定在表达式中使用哪些行。
以下示例,以sql-Server数据库中的northwind数据库中的Orders数据表,描述订单信息,包含字段为:订单号(OrderID)、客户编号(CustomerID)、职工编号(EmployeeID)、订货时间(OrderDate)、船号(ShipVia)、运费(Freight)。
@H_404_26@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文件中去的 *** 作,实例代码如下所示:
@H_404_26@//创建一个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的结构,不然会出错。
实例代码如下所示:
@H_404_26@string tbxml = xmlinfo;Datatable dt = new Datatable("Customers ");DataColumn dc1 = new DataColumn("CustID",Type.GetType("System.String"));dt.Columns.Add(dc1);dt.Columns.Add(dc2);System.IO.StringReader reader = new System.IO.StringReader(tbxml);dt.readxml(reader); 原文地址:http://blog.csdn.net/wangxx2011/article/details/7384197 总结以上是内存溢出为你收集整理的DataTable *** 作全部内容,希望文章能够帮你解决DataTable *** 作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)