惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
T
Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tenable Blog
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
TaoSecurity Blog
TaoSecurity Blog
P
Palo Alto Networks Blog
Spread Privacy
Spread Privacy
I
Intezer
Security Latest
Security Latest
The Last Watchdog
The Last Watchdog
Google DeepMind News
Google DeepMind News
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
N
News and Events Feed by Topic
O
OpenAI News
A
Arctic Wolf
S
Secure Thoughts
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
M
MIT News - Artificial intelligence
F
Full Disclosure
P
Privacy International News Feed
The GitHub Blog
The GitHub Blog
T
Troy Hunt's Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
H
Hacker News: Front Page
aimingoo的专栏
aimingoo的专栏
S
Security @ Cisco Blogs
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
Cloudbric
Cloudbric
大猫的无限游戏
大猫的无限游戏
Google Online Security Blog
Google Online Security Blog
Recent Announcements
Recent Announcements
H
Help Net Security
量子位
V
V2EX
美团技术团队
G
Google Developers Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Schneier on Security
V2EX - 技术
V2EX - 技术
D
Docker
博客园 - 【当耐特】
Project Zero
Project Zero
博客园 - 司徒正美

博客园 - Ewin

微信红包引流量攻略 贴吧论坛引流量案例纪实 新站4个月,新手做网站经验总结 盘点三个网络赚零花钱的小项目,傻瓜式操作 如何运营一个女性社区? 女性社区TOP10 微商怎么做月入过万?新手必看 DataTable对象在内存中的使用(一) CDATA的对特殊字符作用说明 CSS优先级及继承 Tab选项面板(不带图片版) 像素 像素深度 分辨率 三、数据库原理-设计 二、数据库原理-设计理论 一、数据库原理-绪论 如何理解 多个 exists sql(查询选修了全部课程的学生姓名) 内连接、左外连接、右外连接、交叉连接区别 group by 与 order by 软件开发升级指南(转)
DataTable对象在内存中的使用(二)
Ewin · 2010-07-30 · via 博客园 - Ewin

8.4.6  用编程方式添加DataTable

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

DataColumn对象集合表示了表的模式(Schema)DataTable通过内部的DataColumnCollection类型保存表中所有列。相反,DataRow类型集合就表示表中的实际数据。这样,如果Customers表中有10个记录,就可以使用10DataRow类型来表示它们。使用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表中。

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

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

DataRowCollectionRemove方法采用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来控制。

DataAdapterSelectCommand属性是一个Command对象,用于从数据源中检索数据。DataAdapterInsertCommandUpdateCommandDeleteCommand属性也是Command对象,用于按照对DataSet中数据的修改来管理对数据源中数据的更新。

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

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

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

实现代码如下所示:

//使用DataAdapterFill方法向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中的表名。

qColumnsNameTableName表中的某一列名。

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

功能说明:

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

Select * From TableName where ColumnsName= DataValue

8.4.11   DataTable中数据记录的统计

在使用数据库时例如SQL-ServerOracle这些数据库,可以轻松的通过统计和计算函数例如SumAverCount等统计或计算出相关结果,那么,在已经把数据检索出来的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.统计所有职工编号EmployeeID5的数量:

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

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

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

3.统计运费Freight的平均值

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

4.统计职工编号EmployeeID5的运费总额:

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  DataTablexml的一些应用总结

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

//创建一个Customers数据表

DataTable dt = new DataTable("Customers");

//添加两列CustIDCustLName数据类型分别为Int32String,并添加到数据表中

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


Ewin:梦想可以到达的地方,网络就可以做到-开放、平等、自由、充满激情......