详解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()
DataSet及DataTable用法详解

DataSet及DataTable⽤法详解DataSet是开发⼈员为⽅便数据处理开发出来的,是数据的集合,是为解决DataReader的缺陷设计的,DataReader数据处理速度快,但它是只读的, ⽽且⼀旦移到下⼀⾏,就不能查看上⼀⾏的数据,DataSet则可以⾃由移动指针。
DataSet的数据是与数据库断开的。
DataSet还可⽤于多层应⽤程序中,如果应⽤程序运⾏在中间层的业务对象中来访问数据库,则业务对象需将脱机数据结构传递给客户应⽤程序。
DataSet的功能:浏览、排序、搜索、过滤、处理分级数据、缓存更改等。
还可以与XML数据互换。
DataSet中可包括多个DataTable,可将多个查询结构存到⼀个DataSet中,⽅便操作,⽽DataTable中⼜包括多个DataRow、DataColumn,可通过这些DataRow、DataColumn来查看、操作其中的数据,⽽需将操作结果返回给数据库的话,则可以调⽤DataAdapter的 Update⽅法。
DataSet的操作:DataSet ds=new DataSet();DataTable dt=new DataTable("newTable");ds.Tables.Add(dt);DataSet ds=new DataSet();DataTable dt=ds.Tables.Add("newTable");上述两种⽅法都可以在DataSet中添加⼀个DataTable,看需要⽽进⾏选择。
添加DataTable后,需向其中添加⾏和列。
DataSet ds=new DataSet();DataTable dt=ds.Tables.Add("newTables");DataColumn col=dt.Columns.Add("newColumn",typeof(int));col.AllowDBNull=false;col.MaxLength=4;col.Unique=true;上述代码向DataSet中的DataTable中添加名为”newColumn”,类型为int且不为空,最⼤长度为4和唯⼀性为真的列。
简单描述DataAdapter、DataReader、DataSet、Datatable对比

一、存储的对比DataReader从数据库中检索【只读】数据流,存在客户端网络缓冲区,直到Read方法访问它们。
DataAdapter表示一组SQL命令和数据库连接,用于填充DateSet和【更新】数据源DataSet存在内存中的数据缓存,可包含多个DataTableDataTable内存中的数据表二、优缺点三、搭配使用DataReader与SqlCommand搭配使用。
可向DataTable里存入数据。
DataAdapter与DataSet搭配使用。
DataSet可再存入DataTable。
四、最简单实例// DataReader//设连接有效,数据不为空SqlCommand command = new SqlCommand("SELECT id FROM dbo.bu", connection); connection.Open();SqlDataReader reader = command.ExecuteReader();while (reader.Read()){Console.WriteLine(reader.GetInt32(0)); }reader.Close();// DataAdapterDataSet//设连接有效,数据不为空SqlDataAdapter adapter = new SqlDataAdapter("SELECT id FROM dbo.bu ", connection); DataSet customers = new DataSet();adapter.Fill(customers,"bu");。
DataSet与DataTable对象

DataSet与DataTable对象DataSet对象DataSet是中最核心的成员之一,是各种基于.NET平台程序语言(如、C#.NET、C++.NET)的数据库应用程序开发最常接触的类,这是因为DataSet在 实现从数据库中抽取数据的作用。
数据抽取后,DataSet就是数据的存放地,它是各种数据源(SQL Server 、OLE DB等)的数据在计算机内存的缓存,所以有时说DataSet可以看成是一个数据容器(又称数据集)。
在客户端通过对DataSet的数据集读取、更新等操作,从而实现对数据源的同等操作。
DataSet的最大优点是离线(断开)和连接。
DataSet既可以以离线方式,也可以以实时连接方式来操作数据库中的数据。
这样的好处是大大减少了服务器端数据库的连接线程,从而大大地减少了服务器端的运行压力。
所以,在数据量不大的情况下,使用DataSet是最好的选择。
DataSet的基本工作过程:应用程序一般并不直接对数据库进行操作(直接在程序中调用存储过程等除外),而是先完成和数据库的连接,接着通过数据适配器(DataAdapter)把数据库中的数据填入DataSet对象,然后客户端再通过读取DataSet来获得需要的数据,同样,在更新数据库中的数据时,也是首先更新DataSet,然后再通过DataSet和数据适配器将更新的数据同步地解释入数据库中。
DataSet中的几个重要对象:TablesCollection对象:DataSet 里的表用DataTable来表示,一个DataSet里面可以包含多个DataTable,这些DataTable就构成了TablesCollection对象。
每个DataTable中都包含一个ColumnsColleciton和一个RowsCollection对象。
RelationsCollection对象:各个DataTable之间的关系通过DataRelation来表达,这些DataRelation构成的集合就是RelationsCollection对象。
dataTable,dataView和Dataset 区别

1、DataView是DataTable的表示,DataTable表里的记录是没有顺序的,但显示可以有不同顺序(DataVIew),但还是同一张表,所以一个DataTable可以有多个DataView,默认访问DataTable,其实是访问他的DefaultView。
DataSet则是DataTable的集合,也可以有不止一个DataTable2、DataView 是一张DataTable的虚拟视图,主要用来显示数据的,其实数据的更改都是发生在DataTable中。
如果以数据库来打比方,DataSet就是一个功能简单的数据库,是多个表(DataTable)的集合,DataTable就是对应数据库中的表,而DataView则对应数据库中的视图(View)。
中有一层对象,用来创建任意数据源的抽象模型。
其中包括DataSet,DataTable,DataRow,DataView,DataRelation等等。
所有这些对象都定义在System.Data名字空间。
它们形成一个抽象模型,使得无论针对Windows Form,Web Form还是Web Service进行编程,都可以使用相同的编程接口。
在实际应用中,这些对象大多会对诸如SQL Server一类的关系型数据库中的数据进行操作。
但是,它们可以处理各种数据,而不管它的物理存储媒介。
你可以使用DataSet对象来打包和关联各表中的数据,用DataTable类来处理表格类型的数据,而DataRow对象可以处理表中某一行的数据。
这三个对象都是对数据进行打包,但有不同的逻辑聚合层次。
DataSet是DataTable和其他的组合。
而DataTable是DataRow和其他的组合。
DataRow是字段和其他的组合。
但是这些对象中都没有内建过滤和排序的功能。
提供了一些类来处理这个数据库应用程序中的重要方面。
在.Net Beta2中,这方面最重要的两个对象就是DataView和DataViewManager。
C#中DataSet,DataTable,DataReader,DataAdapter的比较

.net进行数据库操作的时候,难免遇到DataSet,DataReader和DataTable,下面让我们来认识一下:DataSet:表示一个数据集,是数据在内存中的缓存,可以包括多个表。
DataSet.Table(“表名”).Rows(行号)(“字段名”)DataTable:表示内存中数据的一个表。
DataTable.Rows(行号)(“字段名”)DataReader:DataReader对象是用来读取数据库的最简单方式,只能读取,不能写入,并且是从头至尾往下读的,无法只读某条数据;但他占用内存小,速度快。
DataAdapter:DataAdapter对象是用来读取数据库,可读取写入数据;但他占用内存比DataReader大,速度慢。
DatSet连接数据库是非面向连接的,他把表读到缓存中,并断开与数据库的连接。
DataReader连接数据库是面向连接的。
读表时,只能向前读取,读完数据后,由用户决定是否断开连接。
DataSet保存了数据的数据结构,DataReader不承担保存数据的责任,他只负责从数据源读取数据到本地,不是数据结构,而是网络通讯组件的高层封装。
DataAdapter,使用DataReader从数据源读取数据并Add到DataSet保存起来。
实际上我们从数据库获得数据都会通过DataReader,只不过DataAdapter把这一切都封装起来了。
DataSet不能直接用来存储数据,如果仅用DataSet,它会自动的生成一个DataTable,所以看上去就像一个DataTable。
如果有很多个DataTable需要同时绑定到某个控件,就可以把多个DataTable添加到一个DataSet中,分别起不同的名字就可以了。
DataReader&DataTableDataReader To DataTable:Dim dr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)Dim dt As DataTable = New DataTable()dt.Load(dr)DataTable To DataReader:Dim dt Ad DataTable = ……Dim dr As DataTableReader = dt.CreateDataReader()注意:1. 使用Load方法时,如果DataTable中已经存有数据,新旧数据将合并。
C#DataTbale详细操作

C#DataTbale详细操作DataTable dt = new DataTable("Table_AX");//⽅式⼀(我觉得这种好)dt.Columns.Add("column0", System.Type.GetType("System.String"));//⽅式⼆DataColumn dc = new DataColumn("column0", typeof(string));DataColumn dc = new DataColumn("column1", System.Type.GetType("System.Boolean"));dt.Columns.Add(dc);DataRow dr = dt.NewRow();dr["column0"] = "AX";dr["column1"] = true;dt.Rows.Add(dr);dt.Columns.Remove("column0");//判断是否有数据if (dt.Rows.Count > 0){//有}DataRow[] drs = dt.Select("column1 is null");DataRow[] drss = dt.Select("column0 = 'AX'");//返回第⼀条DataRow dr = dt.Select("column1 is null").First();//多条件⽤and连接DataRow[] rows = dt.Select("column0 = 'AX' and column1 == true").First();//复制⼀个DataTable(有数据)DataTable dtNew = dt.Copy();//复制⼀个空的DataTable(⽆数据)DataTable dtOnlyScheme = dt.Clone();//将 DataRow 复制到 DataTable 中,保留任何属性设置以及初始值和当前值DataRow[] rows = dt.Select("column0 = 'AX' and column1 == true").First();foreach (DataRow row in rows){dtNew.ImportRow(row);//复制⾏数据}DataRow drOperate = dt.Rows[0];//⽅式⼀drOperate["column0"] = "AXzhz";drOperate["column1"] = false;//⽅式⼆drOperate[0] = "AXzhz";drOperate[1] = false;//⽅式三dt.Rows[0]["column0"] = "AXzhz";dt.Rows[0]["column1"] = false;//⽅式四dt.Rows[0][0] = "AXzhz";dt.Rows[0][1] = false;dtOnlyScheme.Rows.Add(dt.Rows[0].ItemArray);System.IO.StringWriter sw = new System.IO.StringWriter();System.Xml.XmlTextWriter xw = new System.Xml.XmlTextWriter(sw);dt.WriteXml(xw);//此处DataTable必须有名字string s = sw.ToString();dt.DefaultView.RowFilter = "column1 <> true";dt.DefaultView.RowFilter = "column1 = true";dt.DefaultView.Sort = "column0 ,column1 ASC";dt = dt.DefaultView.ToTable();bool flag = dt.Columns.Contains("AX");string str =dt.Rows[第⼏⾏]["字段名"].ToString();string str =dt.Rows[第⼏⾏][第⼏列].ToString();//for循环for (int i = 0; i < dt.Rows.Count; i++){string str = dt.Rows[i]["字段名"].ToString();string str = dt.Rows[i][第⼏列].ToString();}//foreach循环foreach (DataRow dr in dt.Rows){string str = dr["字段名"].ToString();}//创建DataTable对象DataTable dt = new DataTable("Table_AX");//为DataTable创建列//⽅式⼀(我觉得这种好)dt.Columns.Add("column0", System.Type.GetType("System.String"));//⽅式⼆DataColumn dc = new DataColumn("column1", System.Type.GetType("System.Boolean")); dt.Columns.Add(dc);//添加数据DataRow dr = dt.NewRow();dr["column0"] = "AX";dr["column1"] = true;dt.Rows.Add(dr);//判断是否有数据if (dt.Rows.Count > 0){//有}//查询DataRow[] drs = dt.Select("column1 is null");DataRow[] drss = dt.Select("column0 = 'AX'");//复制⼀个DataTable(有数据)DataTable dtNew = dt.Copy();//复制⼀个空的DataTable(⽆数据)DataTable dtOnlyScheme = dt.Clone();//给DataRow赋值的三种⽅式DataRow drOperate = dt.Rows[0];//⽅式⼀drOperate["column0"] = "AXzhz";drOperate["column1"] = false;//⽅式⼆drOperate[0] = "AXzhz";drOperate[1] = false;//⽅式三dt.Rows[0]["column0"] = "AXzhz";dt.Rows[0]["column1"] = false;//⽅式四dt.Rows[0][0] = "AXzhz";dt.Rows[0][1] = false;//把DataRow数据存到DataTable中dtOnlyScheme.Rows.Add(dt.Rows[0].ItemArray);//转成字符串System.IO.StringWriter sw = new System.IO.StringWriter(); System.Xml.XmlTextWriter xw = new System.Xml.XmlTextWriter(sw); dt.WriteXml(xw);//此处DataTable必须有名字string s = sw.ToString();//筛选数据(详见DefaultView⽂章)dt.DefaultView.RowFilter = "column1 <> true";dt.DefaultView.RowFilter = "column1 = true";//排序dt.DefaultView.Sort = "column0 ,column1 ASC";dt = dt.DefaultView.ToTable();//绑定的其实是DefaultView//gvTestDataTable.DataSource = dt;//gvTestDataTable.DataBind();//判断⼀个字符串是否为DataTable的列名bool flag = dt.Columns.Contains("AX");整合代码。
C#与Access数据库相关操作

C#对Access数据库的操作下面以Access数据库为例说明,用C#的DataSet类访问数据库的一些操作方法。
操作涉及的主要C#类有:DataSet:对应数据库表的一个集合,实际上是数据库表在内存中的一个缓存DataTable:对应数据库表,是数据库表行的集合DataRow:对应数据库表行OleDbConnection:建立数据库连接OleDbDataAdapter:由数据库生成DataSet,并负责DataSet与数据库的同步OleDbCommandBuilder:生成更新数据库所需的指令DataSet、DataTable、DataRow用于数据在缓存中的操作,这上面的操作只有更新到数据库中,修改结果才会被永久保存。
OleDbConnection 是用OLEDB方法连接数据库所必需的。
OleDbDataAdapter和OleDbCommandBuilder用来生成DataSet,完成数据库更新。
与OleDbDataAdapter和OleDbCommandBuilder相对应,SqlDataAdapter和SqlCommandBuilder也可以完成用SQL语言为指令的数据库更新。
假设在D:盘创建了Access数据库,其路径为d:\0DBAcs\account.mdb,数据库中有一张名为kaizhi的数据库表。
表结构如下:表建好之后:(1)对表中添加新数据(2)查询表中的某个字段。
为了实现这两项功能,以下几个问题要考虑:1准备工作声明必须的公共变量建立与数据库的连接,创建DataSet对象2添加记录在DataSet对象上添加记录同步DataSet对象对象与数据库中的数据,这一点很重要,很多人忘记了数据进行同步,结果往往是添加、修改的数据不能保存到数据库中。
3查询数据库表中某记录的某字段;我们可以将上述功能用一个类DataOper实现,下面是程序设计的主要活动。
声明要用的C#系统类using System;using System.Collections.Generic;using System.Text;using System.IO;using System.Data;using System.Data.OleDb;using System.Data.SqlClient;声明DataOper类中的公共变量private string DBlocation;private OleDbConnection dbconn; //数据库连接private OleDbDataAdapter da;建立与数据库的连接,这里采用了OLEDB方法:dbconn = newOleDbConnection(@"provider=microsoft.jet.oledb.4.0; Data Source=d:\0DBAcs\account.mdb");dbconn.Open();创建DataSet对象da = new OleDbDataAdapter(@"select * from kaizhi", dbconn); //引用数据库连接dbconn并依据SQL语句"select * from kaizhi"创建OleDbDataAdapter对象daDataSet ds = new DataSet(); //创建DataSet对象da.Fill(ds); //用OleDbDataAdapter对象da填充、更新刚创建的DataSet对象添加记录并更新数据库OleDbCommandBuilder cb = new OleDbCommandBuilder(da); // 创建OleDbCommandBuilder对象cb用于更新OleDbDataAdapter对象da的Insert、Delete、Update指令da.UpdateCommand = cb.GetUpdateCommand(); //更新OleDbDataAdapter对象da的指令设计人员可以编写自己的更新指令,也可以象上面所写的那样用系统默认的指令。
DataSet、DataTable、DataRow区别详解

DataSet、DataTable、DataRow区别详解表⽰数据在内存中的缓存。
属性Tables 获取包含在 DataSet 中的表的集合。
ds.Tables["sjxx"]表⽰内存中数据的⼀个表。
公共属性Columns 获取属于该表的列的集合。
DataSet 获取此表所属的 DataSet。
DefaultView 获取可能包括筛选视图或游标位置的表的⾃定义视图。
PrimaryKey 获取或设置充当数据表主键的列的数组。
Rows 获取属于该表的⾏的集合。
TableName 获取或设置 DataTable 的名称。
表⽰ DataTable 中的⼀⾏数据row["index"]表⽰ DataTable 中列的架构。
复制代码代码如下:DataTable与DataSet常⽤操作实例//创建DataSetDataSet ds = new DataSet();//创建DataTableDataTable dt = new DataTable();dt.Columns.Add("id",Type.GetType("System.Int32"));dt.Columns["id"].AutoIncrement = true;dt.Columns.Add("name",Type.GetType("System.String"));//插⼊⾏DataRow dw1 = dt.NewRow();dw1["name"] = "test1";dt.Rows.Add(dw1);DataRow dw2 = dt.NewRow();dw2["name"] = "test2";dt.Rows.InsertAt(dw2,0);//将DataTable添加到DataSet中ds.Tables.Add(dt);//DataTable中查询DataTable dt = new DataTable();DataRow dr[] = dt.Select("1 = 1");//DataTable更新DataTable dt = (DataTable)HttpContext.Current.Cache["MYCACHE"]; DataRow[] dr = dt.Select("1 = 1");if (dr.Length > 0){dr[0]["colName"] = "colValue";}//统计object o = pute("SUM(col_name)", "1=1");。
C#DataTableDataSetDataRow转实体类集合,实体类和实体类集合转成Da。。。

C#DataTableDataSetDataRow转实体类集合,实体类和实体类集合转成Da。
代码越写越灵活,分享越分享越快乐C# DataTable DataSet DataRow 转实体类集合,实体类和实体类集合转成DataTable 扩展⽅法分享using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Reflection;namespace System{///<summary>/// DataTable转list泛型集合///</summary>public static class DataTableExtend{///<summary>/// DataTable转换List///</summary>///<typeparam name="T">泛型</typeparam>///<param name="dt">DataTable</param>///<returns>List泛型集合</returns>public static List<T> ToList<T>(this DataTable dt) where T : class, new(){var list = new List<T>();foreach (DataRow dr in dt.Rows){//泛型对象T model = dr.ToDataRowModel<T>();list.Add(model);}return list;}///<summary>/// DataSet转换List///</summary>///<typeparam name="T">泛型</typeparam>///<param name="dt">DataTable</param>///<returns>List泛型集合</returns>public static List<T> ToList<T>(this DataSet ds) where T : class, new(){var list = new List<T>();list = ds.Tables[0].ToList<T>();return list;}///<summary>/// DataRow转换T模型///</summary>///<typeparam name="T">泛型</typeparam>///<param name="dt">DataTable</param>///<returns>List泛型集合</returns>public static T ToDataRowModel<T>(this DataRow dr) where T : class, new(){//泛型对象T model = new T();//属性集合var listPro = model.GetType().GetProperties().Where(item => !item.IsDefined(typeof(InternalAttribute), false)).ToArray();foreach (PropertyInfo pi in listPro){var columnName = ;//属性=字段var columnType = pi.PropertyType;//属性类型var underlyingtype = Nullable.GetUnderlyingType(columnType);//返回指定可以为null值的类型//判断属性是否可以写⼊if (!pi.CanWrite) continue;if (!dr.Table.Columns.Contains(columnName)) continue;var value = dr[columnName];//判断字段值是否为空if (value == DBNull.Value) continue;//根据属性类型转换数据库字段类型if (columnType == typeof(string))pi.SetValue(model, value.ToString(), null);else if (columnType == typeof(int) || columnType == typeof(int?))pi.SetValue(model, Convert.ToInt32(value), null);else if (columnType == typeof(DateTime) || columnType == typeof(DateTime?))pi.SetValue(model, Convert.ToDateTime(value), null);else if (columnType == typeof(decimal))pi.SetValue(model, Convert.ToDecimal(value), null);else if (columnType == typeof(double))pi.SetValue(model, Convert.ToDouble(value), null);else if (columnType == typeof(float))pi.SetValue(model, Convert.ToSingle(value), null);else if ((underlyingtype ?? columnType).IsEnum){if (underlyingtype != null && !string.IsNullOrEmpty(value.ToString()))pi.SetValue(model, Enum.Parse(underlyingtype ?? columnType, value.ToString()), null);else if (underlyingtype == null && !string.IsNullOrEmpty(value.ToString()))pi.SetValue(model, Convert.ToInt32(value), null);elsepi.SetValue(model, -1, null);}elsepi.SetValue(model, value, null);}return model;}}}实体列表转换成DataTable///<summary>///实体列表转换成DataTable///</summary>///<typeparam name="TEntity">实体</typeparam>///<param name="entityList">实体列表</param>///<returns></returns>public static DataTable EntityListToDataTable<TEntity>(this IList<TEntity> entityList)where TEntity : class{if (entityList == null) return null;var dt = new DataTable(typeof(TEntity).Name);var myPropertyInfo = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance);#region创建表结构foreach (var property in myPropertyInfo){Type colType = property.PropertyType;if (colType.IsGenericType && colType.GetGenericTypeDefinition() == typeof(Nullable<>)){colType = colType.GetGenericArguments()[0];var col = new DataColumn(, colType) { Caption = property.ToDescription() }; col.AllowDBNull = true;dt.Columns.Add(col);}else{var col = new DataColumn(, colType) { Caption = property.ToDescription() }; dt.Columns.Add(col);}}#endregionforeach (var entity in entityList){if (entity == null) continue;var row = dt.NewRow();foreach (var propertyInfo in myPropertyInfo){if (propertyInfo.GetValue(entity, null) == null)row[] = DBNull.Value;elserow[] = propertyInfo.GetValue(entity, null);}dt.Rows.Add(row);}return dt;}实体转换成DataTable///<summary>///实体转换成DataTable/// Add by loki 20201011///</summary>///<typeparam name="TEntity">实体</typeparam>///<returns></returns>public static DataTable EntityToDataTable<TEntity>(this TEntity entity)where TEntity : class{if (entity == null) return null;var dt = new DataTable(typeof(TEntity).Name);var myPropertyInfo = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance);#region创建表结构foreach (var property in myPropertyInfo){Type colType = property.PropertyType;if (colType.IsGenericType && colType.GetGenericTypeDefinition() == typeof(Nullable<>)){colType = colType.GetGenericArguments()[0];var col = new DataColumn(, colType) { Caption = property.ToDescription() };col.AllowDBNull = true;dt.Columns.Add(col);}else{var col = new DataColumn(, colType) { Caption = property.ToDescription() };dt.Columns.Add(col);}}#endregionvar row = dt.NewRow();foreach (var propertyInfo in myPropertyInfo){if (propertyInfo.GetValue(entity, null) == null)row[] = DBNull.Value;elserow[] = propertyInfo.GetValue(entity, null);}dt.Rows.Add(row);return dt;}你如果觉得有⽤就拿去不⽤谢!C# DataTable DataSet DataRow 转实体类集合,实体类和实体类集合转成DataTable 扩展⽅法分享,这⾥其实很简单,就是⽤到反射技术去实现的,将数据库表字段与C#实体属性进⾏反射。
c中datatable的用法

c中datatable的用法c中datatable的用法的用法你知道吗?下面小编就跟你们详细介绍下c中datatable的用法的用法,希望对你们有用。
c中datatable的用法的用法如下:一、排序1.获取DataTable的默认视图2.对视图设置排序表达式3.用排序后的视图导出的新DataTable替换就DataTable(Asc升序可省略,多列排序用","隔开)1)、重生法复制代码代码如下:dstaset.Tables.Add(dt)dataset.Tables(0).DefaultView.Sort = "id desc"2)、直接法复制代码代码如下:dv = New DataView(dt)dv.Sort = "id desc"dt = dv.ToTable();3)、间接法复制代码代码如下:dv = New DataView(ds.Tables[0])dv.Sort = "id desc"dt = dv.ToTable();二、检索设置查询字符串使用Select方法获取到所有满足条件的数据行对象数组 (多项查询条件间,用and隔开)复制代码代码如下:DataRow[] matches = dt.Select("id<'003' and name='名字11'");string strName = matches[0]["name"].ToString();三、合并假定有2个DataTable:Dt1 , Dt2。
表结构一样将Dt2接在Dt1后可采用此方法复制代码代码如下:dt1.Merge(dt2);四、在DataTable中查询应该注意的问题完成一个查询,返回一个DataTable后,很多时候都想在查询结果中继续搜索。
这时可以使用DataTable.Select方法对结果进行再查询Select方法有4个重载,我们经常用到的就是DataTable.Select(String)这个String的参数是查询的限定式。
C#DataTable数据表对象

C#DataTable数据表对象
C# DataTable数据表对象
可以在与数据库断开连接的方式下通过DataSet或DataTable对象进行数据处理,当需要更新数据时才重新与数据源进行连接,并更新数据源。
DataTable 对象表示保存在本机内存中的表,它提供了对表中行列数据对象的各种操作。
可以直接将数据从数据库填充到DataTable对象中,也可以将DataTable对象添加到现有的DataSet对象中。
在断开连接的方式下,DataSet对象提供了和关系数据库一样的关系数据模型,代码中可以直接访问DataSet对象中的DataTable对象,也可以添加、删除DataTable对象。
1.DataTable对象的创建
DataTable是DataSet中的常用的对象,它和数据库中的表的概念十分相似。
开发人员能够将DataTable想象成一个表。
并且可以通过编程的方式创建一个
上述代码创建了一个DataTable对象,并为DataTable对象设置了若干属性,这些属性都是常用的属性,其作用如表11-5所示。
表11-5 DataTable对象的常用属性
2.在DataTable对象中添加列
一个表必须有一个列,而DataTable必须包含列。
当创建了一个DataTable后,就必须向DataTable中增加列的。
表中列的集合形成了二维表的数据结构。
开发人员可以使用Columns集合的Add方法向DataTable中增加列,Add方法带有两个参数,一个是表列的名称,
一个是该列的数据类型。
示例代码如下所示。
- 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中的字符串比较是否区分大小写。