详解C__DataSet和DataTable
C#Datatable的几种用法小结

C#Datatable的⼏种⽤法⼩结在C#中,从数据库中读取出来的数据⼀般都会存储在datatable中。
datatable其实也是⼀张表,就像是从数据库中将检索出来的结果copy到datatable中⼀样。
datatable的内部数据结构就是这样的⼀个⼆维表。
下⾯介绍⼀下datatable中的⼏种⽤法。
添加引⽤//引⽤命名空间using System.Data;创建表//创建⼀个空表DataTable dt = new DataTable();//创建⼀个名为"new-tabel"的空表;DataTable dt = new DataTable("new-tabel");创建列//1.创建空列DataColumn dc = new DataColumn();//将空列加⼊到dt表中dt.Columns.Add(dc);//2.创建带列名和类型名的列(两种⽅式任选其⼀)dt.Columns.Add("column0", System.Type.GetType("System.String"));dt.Columns.Add("column0", typeof(String));//3.通过列架构添加列DataColumn dc = new DataColumn("column1",System.Type.GetType("System.DateTime"));DataColumn dc = new DataColumn("column1", typeof(DateTime));dt.Columns.Add(dc);创建⾏//1.创建空⾏DataRow dr = dt.NewRow();dt.Rows.Add(dr);//2.创建空⾏dt.Rows.Add();//3.通过⾏框架创建并赋值dt.Rows.Add("张三",DateTime.Now);//Add⾥⾯参数的数据顺序要和dt中的列的顺序对应//4.通过复制dt2表的某⼀⾏来创建dt.Rows.Add(dt2.Rows[i].ItemArray);取值和赋值//新建⾏的赋值DataRow dr = dt.NewRow();dr[0] = "张三";//通过索引赋值dr["column1"] = DateTime.Now; //通过名称赋值//对表已有⾏进⾏赋值dt.Rows[0][0] = "张三"; //通过索引赋值dt.Rows[0]["column1"] = DateTime.Now;//通过名称赋值//取值string name=dt.Rows[0][0].ToString();string time=dt.Rows[0]["column1"].ToString();从datatable中取值的时候⼀般⽤到的是rows属性。
DataSet、DataTable、DataView三者关系及DataView常见用法

DataSet、DataTable、DataView三者关系及DataView常见用法DATASET 可以理解为是个数据库。
DATATABLE 可以理解为是个数据表。
DATAVIEW 可以理解为是表的视图。
dataset 数据集合可以包含多个datatable,而datatable可以声明多个dataview。
dataview是个虚拟的视图,用于数据展示层,可以通过对它的RowFilter、Sort属性的设置,控制输出想要的数据集合。
DataView过滤和排序1 //假设有个DataT able2 DataTable dt=new DataTable();3 //转成一个DataView4 DataView dv=dt.DefaultView;5 //加上过滤条件6 dv.FilterSort=" 员工='张三'";7 //重新转化为新DataTable8 DataTable newTable=dv.ToTable();//员工ID大于5且生日小于?dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/31/82#";//描述类似于product关键字dv.RowFilter = "Description LIKE '*product*'";//员工ID等于 2 or 4 or 5dv.RowFilter = "employeeID IN (2,4,5)";//如果在LIKE子句中已经有了*或%字符,你必须用方括号将其括起,以免歧义。
如果很不幸,字符串中方括号本身也存在了,那么它也必须用将本身括起dv.RowFilter = "Description LIKE '[[]*[]]product[[]*[]]";//员工ID小于6且名字字数偶数,员工ID大于6且名字字数奇数dv.RowFilter="IIF(employeeID<6, Len(lastname) %2 =0, Len(lastname) %2 >0)";//排序//正序dv.Sort = "ID asc";//倒序dv.Sort = "ID desc";//多个排序view.Sort = "ID DESC,Name ASC";。
c#DataSet和DataTable的处理主键外键设置连接俩个表的关系

c#DataSet和DataTable的处理主键外键设置连接俩个表的关系View Codeusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;namespace CreateTable{public class Table{public DataTable CreateBuildiing(){DataTable aBuilding = new DataTable("Building");aBuilding.Columns.Add(new DataColumn("BuildingID", typeof(int)));aBuilding.Columns.Add(new DataColumn("Name", typeof(string)));aBuilding.Constraints.Add(new UniqueConstraint("PK_Building", aBuilding.Columns[0]));aBuilding.PrimaryKey = new DataColumn[] { aBuilding.Columns[0] };return aBuilding;}public DataTable CreateRoom(){DataTable aRoom = new DataTable("Room");aRoom.Columns.Add(new DataColumn("RoomID", typeof(int)));aRoom.Columns.Add(new DataColumn("Name", typeof(string)));aRoom.Columns.Add(new DataColumn("BuildingID", typeof(int)));aRoom.Constraints.Add(new UniqueConstraint("PK_Room", aRoom.Columns[0]));aRoom.PrimaryKey = new DataColumn[] { aRoom.Columns[0] };return aRoom;}public DataSet AddTables(){DataSet ds = new DataSet("Relationships");ds.Tables.Add(CreateBuildiing());ds.Tables.Add(CreateRoom());//连接⼀个表的关系ds.Relations.Add("Rooms", ds.Tables[0].Columns[0], ds.Tables[1].Columns[0]);return ds;}///<summary>///根据主表得到⼦表数据根据⼦表得到主表///</summary>public void ForeachTabel(){DataSet ds = AddTables();foreach (DataRow theBuilding in ds.Tables[0].Rows){//根据主表得到⼦表DataRow[] children = theBuilding.GetChildRows("Rooms");}foreach (DataRow theRoom in ds.Tables[1].Rows){//根据⼦表得到主表DataRow[] parents = theRoom.GetParentRows("Rooms");}}///<summary>///创建主键///</summary>///<param name="dt"></param>public void ManufacturePrimaryKey(DataTable dt){DataColumn[] pk = new DataColumn[1];pk[0] = dt.Columns["ID"];dt.Constraints.Add(new UniqueConstraint("PK_ID", pk[0]));dt.PrimaryKey = pk;}///<summary>///创建外键///</summary>///<param name="ds"></param>public void CreateWaiJian(DataSet ds){DataColumn parent = ds.Tables[0].Columns["ParentID"];DataColumn child = ds.Tables[1].Columns["ChildID"];ForeignKeyConstraint fk =new ForeignKeyConstraint(parent, child);fk.UpdateRule = Rule.Cascade;fk.DeleteRule = Rule.SetNull;ds.Tables["Child"].Constraints.Add(fk);}///<summary>///得到版本值///</summary>///<param name="ds"></param>public void GetTableVersion(DataSet ds){foreach (DataRow row in ds.Tables[0].Rows){#region// public enum DataRowState//{// 摘要:// 该⾏已被创建,但不属于任何 System.Data.DataRowCollection。
C#实现DataTable、DataSet与XML互相转换

C#实现DataTable、DataSet与XML互相转换/**//// <summary>/// 把DataSet、DataTable、DataView格式转换成XML字符串、XML⽂件/// </summary>public class DataToXml{/**//// <summary>/// 将DataTable对象转换成XML字符串/// </summary>/// <param name="dt">DataTable对象</param>/// <returns>XML字符串</returns>public static string CDataToXml(DataTable dt){if (dt != null){MemoryStream ms = null;XmlTextWriter XmlWt = null;try{ms = new MemoryStream();//根据ms实例化XmlWtXmlWt = new XmlTextWriter(ms, Encoding.Unicode);//获取ds中的数据dt.WriteXml(XmlWt);int count = (int)ms.Length;byte[] temp = new byte[count];ms.Seek(0, SeekOrigin.Begin);ms.Read(temp, 0, count);//返回Unicode编码的⽂本UnicodeEncoding ucode = new UnicodeEncoding();string returnValue = ucode.GetString(temp).Trim();return returnValue;}catch (System.Exception ex){throw ex;}finally{//释放资源if (XmlWt != null){XmlWt.Close();ms.Close();ms.Dispose();}}}else{return "";}}以上转换在⼀些xml版本中存在问题,会出现SoapToolkit调⽤的时候返回值错误,那么这时候可以⽤以下这个⽅法做转换(建议⼤家都⽤以下这个⽅法.......因为本⼈曾经深受上⾯那个⽅法其害......T_T)。
[C#技术]DataSet(DataTable)轻松的通过Sum、Aver、Count等统。。。
![[C#技术]DataSet(DataTable)轻松的通过Sum、Aver、Count等统。。。](https://img.taocdn.com/s3/m/6a56eb54b207e87101f69e3143323968011cf4d9.png)
[C#技术]DataSet(DataTable)轻松的通过Sum、Aver、Count等统。
我们在使⽤Sql ******这些数据库时,可以轻松的通过Sum、Aver、Count等统计出相关结果,那么,在已经把数据检索出来的DataSet(DataTable)中呢?特别是通过Web Service获得了DataSet,这个时候,可是没有办法回头去修改Select语句来获取这些统计了。
那么在DataSet/DataTable中是否可以进⾏统计呢?答案是肯定的。
在MSDN中,有⼀篇MS推荐的统计⽅法,就是逐⾏对数据进⾏求和统计,这个⽅法,其实有等于⽆(或许这个⽅法只是针对于DataGrid求取⼩计⽤吧),因为这个⽅法中采⽤的是DataGrid的ItemDataBind事件来对数据进⾏累加,同我们⼿动写代码统计没有什么区别。
本⽂介绍⼀个简单的⽅法,不需要逐条记录进⾏计算就可以轻松的获得DataTable中的记录统计结果。
这个简单的⽅法就是调⽤功能强⼤的DataTable的函数Compute。
⼀、调⽤说明(仅以C#为例,下同):public object Compute(string strExpression,stringstrFilter)参数:strExpression:要计算的表达式字符串,基本上类似于Sql ******中的统计表达式strFilter:统计的过滤字符串,只有满⾜这个过滤条件的记录才会被统计⼆、调⽤举例:以下⽰例,假设⼀个产品销售表table,描述某商场中各促销员销售的实际记录,包含字段为:姓名(Name)、性别(***,0为⼥,1为男)、⽣⽇(Birthday)、销售产品的代码(ProID)、销售的数量(Quantity)、销售价格(Price)。
1.统计所有性别为⼥的销售员的数量:pute("Count(*)","***=0");2.统计所有销售员中年龄⼤于20岁的pute("Count(*)","Birthday<’"+today);//today为今天的⽇期字符串3.统计销售产品的平均价格pute("Aver(Price)","true");4.统计产品代码为1的产品销售数量:pute("Sum(Quantity)","ProID=1");5.统计所有产品的销售总⾦额:要统计总销售⾦额,由于table中不存在某项产品某个促销员销售的⾦额数据,但我们可以通过Quantity*Price来获得。
C# DataSet和DataTable详解

C# DataSet和DataTable详解1、创建DataSet对象:DataSet ds = new DataSet("DataSetName");2、查看调用SqlDataAdapter.Fill创建的结构da.Fill(ds,"Orders");DataTable tbl = ds.Table[0];foreach(DataColumn col in tbl.Columns)Console.WriteLine(col.ColumnName);3、查看SqlDataAdapter返回的数据①、DataRow对象DataTable tbl = ds.Table[0];DataRow row = tbl.Row[0];Console.WriteLine(ros["OrderID"]);②、检查存储在DataRow中的数据DataTable tbl = row.Table;foreach(DataColumn col in tbl.Columns)Console.WriteLine(row[col]);③、检查DatTable中的DataRow对象foreach(DataRow row in tbl.Rows)DisplayRow(row);4、校验DataSet中的数据①、校验DataColumn的属性:ReadOnly,AllowDBNull,MaxLength,Unique②、DataTable对象的Constrains集合:UiqueConstraints,Primarykey,ForeignkeyConstraints通常不必刻意去创建ForeignkeyConstraints,因为当在DataSet的两个DataTable对象之间创建关系时会创建一个。
③、用SqlDataAdapter.Fill模式来检索模式信息5、编写代码创建DataTable对象①、创建DataTable对象:DataTable tbl = new DataTable("TableName");②、将DataTable添加到DataSet对象的Table集合DataSet ds = new DataSet();DataTable tbl = new DataTable("Customers");ds.Tables.Add(tbl);DataSet ds = new DataSet();DataTable tbl = ds.Tables.Add("Customers");DataTable对象只能存在于至多一个DataSet对象中。
C#与数据库访问技术总结(十六)之DataSet对象

C#与数据库访问技术总结(⼗六)之DataSet对象DataSet对象DataSet对象可以⽤来存储从数据库查询到的数据结果,由于它在获得数据或更新数据后⽴即与数据库断开,所以程序员能⽤此⾼效地访问和操作数据库。
并且,由于DataSet对象具有离线访问数据库的特性,所以它更能⽤来接收海量的数据信息。
DataSet对象概述DataSet是中⽤来访问数据库的对象。
由于其在访问数据库前不知道数据库⾥表的结构,所以在其内部,⽤动态XML的格式来存放数据。
这种设计使DataSet能访问不同数据源的数据。
DataSet对象本⾝不同数据库发⽣关系,⽽是通过DataAdapter对象从数据库⾥获取数据并把修改后的数据更新到数据库。
在DataAdapter的讲述⾥,就已经可以看出,在同数据库建⽴连接后,程序员可以通过DataApater对象填充(Fill)或更新(Update)DataSet对象。
.NET的这种设计,很好地符合了⾯向对象思想⾥低耦合、对象功能唯⼀的优势。
如果让DataSet对象能直接连到数据库,那么DataSet对象的设计势必只能是针对特定数据库,通⽤性就⾮常差,这样对DataSet的动态扩展⾮常不利。
由于DataSet独⽴于数据源,DataSet可以包含应⽤程序本地的数据,也可以包含来⾃多个数据源的数据。
与现有数据源的交互通过DataAdapter来控制。
DataSet对象常和DataAdapter对象配合使⽤。
通过DataAdapter对象,向DataSet中填充数据的⼀般过程是:(1)创建DataAdapter和DataSet对象。
(2)使⽤DataAdapter对象,为DataSet产⽣⼀个或多个DataTable对象。
(3)DataAdapter对象将从数据源中取出的数据填充到DataTable中的DataRow对象⾥,然后将该DataRow对象追加到DataTable对象的Rows集合中。
数据集DataSet

筛选DataTable中的数据
DataTable dataTable = new DataTable("学生表临时"); dataTable = dt.Clone(); string expression = "学生编号 = " + Convert.ToInt32(txtID.Text.ToString()); //按照条件筛选数据 DataRow[] foundRows = dt.Select(expression);
第二部分:数据表DataTable的创建
如何创建 DataTable
如何向 DataTable里面 添加数据
如何创建DataTable
//创建一个DataTable的一个实例。 DataTable dt = new DataTable("学生表"); //声明列对象和行对象。 DataColumn column; column = new DataColumn(); //设置列的数据类型 column.DataType = System.Type.GetType("System.Int32"); column.ColumnName = "学生编号"; column.ReadOnly = true; column.Unique = true; //向DataTable添加该列 dt.Columns.Add(column);
如何向DataTable里面添加数据
DataTable 对象还具有允许行在数据集中 被访问的 Rows 集合。 下表描述了通过使用 DataRow 对象对行执 行的各种方法:
Add() InsertAt() Find() Select() Remove()
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
详解C# DataSet和DataTable2010-03-12 10:53:44 作者:佚名来源:浏览次数:01、创建DataSet对象:DataSet ds = new DataSet("DataSetName");1、创建DataSet对象:DataSet ds = new DataSet("DataSetName");2、查看调用SqlDataAdapter.Fill创建的结构da.Fill(ds,"Orders");DataTable tbl = ds.Table[0];foreach(DataColumn col in tbl.Columns)Console.WriteLine(col.ColumnName);3、查看SqlDataAdapter返回的数据①、DataRow对象DataTable tbl = ds.Table[0];DataRow row = tbl.Row[0];Console.WriteLine(ros["OrderID"]);②、检查存储在DataRow中的数据DataTable tbl = row.Table;foreach(DataColumn col in tbl.Columns)Console.WriteLine(row[col]);③、检查DatTable中的DataRow对象foreach(DataRow row in tbl.Rows)DisplayRow(row);4、校验DataSet中的数据①、校验DataColumn的属性:ReadOnly,AllowDBNull,MaxLength,Unique②、DataTable对象的Constrains集合:UiqueConstraints,Primarykey,ForeignkeyConstraints通常不必刻意去创建ForeignkeyConstraints,因为当在DataSet的两个DataTable对象之间创建关系时会创建一个。
③、用SqlDataAdapter.Fill模式来检索模式信息5、编写代码创建DataTable对象①、创建DataTable对象:DataTable tbl = new DataTable("TableName");②、将DataTable添加到DataSet对象的Table集合DataSet ds = new DataSet();DataTable tbl = new DataTable("Customers");ds.Tables.Add(tbl);DataSet ds = new DataSet();DataTable tbl = ds.Tables.Add("Customers");DataTable对象只能存在于至多一个DataSet对象中。
如果希望将DataTable添加到多个DataSet中,就必须使用Copy方法或Clone方法。
Copy方法创建一个与原DataTable结构相同并且包含相同行的新DataTable;Clone方法创建一个与原DataTable结构相同,但没有包含任何行的新DataTable。
③、为DataTable添加列DataTable tbl = ds.Tables.Add("Orders");DataColumn col =tbl.Columns.Add("OrderID",typeof(int));col.AllowDBNull = false;col.MaxLength = 5;col.Unique = true;tbl.PrimaryKey = new DataColumn[]{tbl.Columns["CustomersID"]};当设置主键时,AllowDBNull自动设置为False;1、创建DataSet对象:DataSet ds = new DataSet("DataSetName");④、处理自动增量列DataSet ds = new DataSet();DataTable tbl = ds.Tables.Add("Orders");DataColumn col = tbl.Columns.Add("OrderID",typeof(int));col.AutoIncrement = true;col.AutoIncrementSeed = -1;col.AutoIncrementStep = -1;col.ReadOnly = true;⑤、添加基于表达式的列tbl.Columns.Add("ItemTotal",typeof(Decimal),"Quantity*UnitPrice");6、修改DataTable内容①、添加新DataRowDataRow row = ds.Tables["Customers"].NewRow();row["CustomerID"] = "ALFKI";ds.Tables["Customers"].Rows.Add(row);object[] aValues ={"ALFKI","Alfreds","Anders","030-22222"};da.Tables["Customers"].LoadDataRow(aV alues,false);②、修改当前行修改行的内容逼供内不会自动修改数据库中相应的内容,对行所做的修改被视为是随后将使用SqlDataAdapter对象来提交交给数据库的待定的更改。
DataRow rowCustomer;rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON");if(rowCustomer == null)//没有查找客户else{rowCustomer["CompanyName"] ="NewCompanyName";rowCustomer["ContactName"] ="NewContactName";}//推荐使用这种方式DataRow rowCustomer;rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON");if(rowCustomer == null)//没有查找客户else{rowCustomer.BeginEdit();rowCustomer["CompanyName"] ="NewCompanyName";rowCustomer["ContactName"] ="NewContactName";rowCustomer.EndEdit();}//null表示不修改该列的数据obejct[] aCustomer ={null,"NewCompanyName","NewContactName",null} DataRow rowCustomer;rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");rowCustomer.ItemArray = aCustomer;1、创建DataSet对象:DataSet ds = new DataSet("DataSetName");③、处理DataRow的空值//查看是否为空DataRow rowCustomer;rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");if(rowCustomer.IsNull("Phone"))Console.WriteLine("It's Null");elseConsole.WriteLine("It's not Null");//赋予空值rowCustomer["Phone"] = DBNull.Value;④、删除DataRowDataRow rowCustomer;rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");rowCustomer.Delete();⑤、清除DataRowDataRow rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");rowCustomer.ItemArray = aCustomer;da.Tables["Customers"].Remove(rowCustomer);或者ds.Tables["Customers"].RemoveAt(intIndex);⑥、使用DataRow.RowState属性:Unchanged,Detached,Added,Modified,Deletedprivate void DemonstrateRowState(){ // Run a function to create a DataTable with one column. DataTable myTable = MakeTable ();DataRow myRow;// Create a new DataRow. myRow = myTable.NewRow();// Detached row. Console.WriteLine("New Row " + myRow.RowState);myTable.Rows.Add(myRow);// New row. Console.WriteLine("AddRow " + myRow.RowState);myTable.AcceptChanges();// Unchanged row. Console.WriteLine("AcceptChanges " + myRow.RowState);myRow["FirstName"] = "Scott";// Modified row. Console.WriteLine("Modified " + myRow.RowState);myRow.Delete();// Deleted row. Console.WriteLine("Deleted " + myRow.RowState);}⑦、检查DataRow中的挂起更改DataRow rowCustomer;rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");rowCustomer["CompanyName"] = "NewCompanyName";string strNewCompanyName,strOldCompanyName;Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Current]);Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Original]);1、DataSet①、属性CaseSensitive:用于控制DataTable中的字符串比较是否区分大小写。