通过延迟DataTable的Expression列计算来提高Fill的性能

在使用非强类型普通DataSet的时候,如果要向DataTable中含有Expression列的话,一般都采用下面 这样的步骤来提高应用程序的性能。

1.首先使用DataAdapter.Fill方法填充一个DataTable。

2.然后在通过编码向DataTable中添加Expression列。

3.将这个DataTable作为数据源绑定到相关的控件上(比如DataGridView)。

示例代码:

1     dataAdapter.Fill(dt);
2     dt.Columns.Add("ItemTotal", typeof(Decimal), "Quantity * UnitPrice");
3     dataGridView.DataSource = dt;

当使用强类型类型化DataSet的时候,由于DataTable中的Expression列已经创建好了,就得另辟方法 来解决性能问题。方法的大体思路是这样的:

1.在调用Fill方法之前, 遍历DataTable的所有列,如果该列为Expression则以该列名称作为Key, Expression表达式作为Value存入一个Hashtable中,然后将该列的Expression属性设置为空。

2.调用DataAdapter(或者DataTableAdapter)的Fill方法来填充这个DataTable。

3.最后再遍历DataTable的所有列,判断Hashtable["列名"]是否存在, 如果存在,则将相应的Value 值赋给该列的Expression属性,最后清空Hashtable。

示例代码:

 1Hashtable expressionKey = new Hashtable();
 2
 3//规避DataTable的Expression列,减轻Fill时的负担
 4for (int i = 0; i < targetTable.Columns.Count; i++)
 5{
 6    if (targetTable.Columns[i].Expression != string.Empty)
 7    {
 8        expressionKey.Add(targetTable.Columns[i].ColumnName, targetTable.Columns [i].Expression);
 9        targetTable.Columns[i].Expression = string.Empty;
10    }
11}
12
13tableAdapter.Fill(targetTable);
14
15//恢复DataTable的Expression列,Fill完了之后进行统一的表达式计算
16for (int i = 0; i < targetTable.Columns.Count; i++)
17{
18    if (expressionKey.ContainsKey(targetTable.Columns[i].ColumnName))
19    {
20        targetTable.Columns[i].Expression =
21            (String)expressionKey[targetTable.Columns[i].ColumnName];
22    }
23}
24
25expressionKey.Clear();

时间: 2024-09-16 10:45:58

通过延迟DataTable的Expression列计算来提高Fill的性能的相关文章

datatable行转列示例分享

 这篇文章主要介绍了datatable行转列示例,指定需要转换的表和转换表表头对应旧表字段就可以转换了    代码如下:  /// <summary>   /// DataTable行转列   /// </summary>   /// <param name="dtable">需要转换的表</param>   /// <param name="head">转换表表头对应旧表字段(小写)</param&

关于SQL表中的[LEVEL]以及怎样用DATATABLE获取标识列的数值?

问题描述 关于SQL表中的[LEVEL]以及怎样用DATATABLE获取标识列的数值? 用SQL2014的时候我是想设置一列名为level,表达的意思就是标记表中一行字段的身份级别,但是按ENTER以后, level两边就多了中括号,变成了[level],而且也不能用DATATABLE获取了. 同样的问题,在表中如果有一列为标识列,例如名为ID(会随着表中数据的增加,自动增加数值), 同样,用DATATABLE获取该表中ID的值的时候也会提示错误信息,错误信息为"列'ID'不属于表".

SQL Server利用HashKey计算列解决宽字段查询的性能问题

SQL Server利用HashKey计算列解决宽字段查询的性能问题 主人翁        本文主人翁:MSSQL菜鸟和MSSQL老鸟. 问题提出        某年某月某日,某MSSQL菜鸟满脸愁容的跑到老鸟跟前,心灰意懒的对老鸟说"我最近遇到一个问题,很大的问题,对,非常大的问题".老鸟不急不慢的推了推2000度超级近视眼镜框,慢吞吞的说:"说来听听".        "我有一个100万数据量的表,有一个宽度为7500字段,不幸的是现在我需要根据这个字

如何最大限度提高.NET的性能 (续)

性能    昨天发了一篇如何最大限度提高.NET性能的文章,评论的人不少,在这里非常感谢大家的评论,其中有些是指出文章的一些错误的,在这里感谢那些耐心写评论的老大们,小弟受益不少.      昨天那篇主要是从写代码的一些细节上来提高速度,可能很些是难实际感受到性能的提高,但是作为一名程序员,不断提高自己代码的质量是不断追求的目标.      其实随着硬件的发展,现在硬件的速度已经远远满足大多数人的的需要了,甚至有些人提出算法在现在软件开发中越来越不起作用了.记得以前看过麻省的数据结构视频,讲课的

使用智能优化器提高Oracle的性能极限

oracle|性能|优化  使用智能优化器提高Oracle的性能极限       消耗在准备新的SQL语句的时间是Oracle SQL语句执行时间的最重要的组成部分.但是通过理解Oracle内部产生执行计划的机制,你能够控制Oracle花费在评估连接顺序的时间数量,并且能在大体上提高查询性能.准备执行SQL语句       当SQL语句进入Oracle的库缓存后,在该语句准备执行之前,将执行下列步骤: 1)        语法检查:检查SQL语句拼写是否正确和词序. 2)        语义分析

设置DB2和AIX与条带技术匹配以提高I/O性能

条带化技术是一种广泛使用的 I/O 负载均衡技术,可以在不增加额外硬件投入的情况下极大的提高 I/O 性能.但是在使用了这种技术的环境中,只有对数据库和操作系统的 I/O 处理有良好的规划和设置,使其与条带化技术相匹配,才能使 I/O 的性能达到最好.本文针对这个主题,以 DB2 数据库和 AIX 操作系统为例,介绍了如何规划和设置好相关的内容. 下面我们分如下几个方面来介绍: 条带化技术介绍 在 DB2 中合理规划和设置条带有关参数 在 AIX 中合理规划和设置条带有关参数 总结 条带化技术介

用智能优化限制提高Oracle数据库性能

Oracle SQL运行时间的最主要的组成部分是花在为执行准备新的SQL语句上的时间.不过,如果了解了可执行计划产生的内在机制,你就可以控制Oracle花费在评估表的连接顺序的时间,并在总体上提高查询的性能. 准备为执行提供的SQL语句 在一个SQL语句进入Oracle库的cache之后.而真正被执行之前,将会依次发生如下事件: 语法检查--检查该SQL语句的拼写和词序是否正确. 语义解析--Oracle根据数据词典(data dictionary)来验证所有的表格(table)和列(colum

重磅长文|提高深度学习性能的四种方式

◆ ◆ ◆ 提升算法性能思路 这个列表里提到的思路并完全,但是一个好的开始.  我的目的是给出很多可以尝试的思路,希望其中的一或两个你之前没有想到.你经常只需要一个好的想法就能得到性能提升. 如果你能从其中一个思路中得到结果,请在评论区告诉我.我很高兴能得知这些好消息. 如果你有更多的想法,或者是所列思路的拓展,也请告诉我,我和其他读者都将受益!有时候仅仅是一个想法或许就能使他人得到突破. 我将此博文分为四个部分:  1. 通过数据提升性能  2. 通过算法提升性能  3. 通过算法调参提升性能

提高 DHTML 页面性能_javascript技巧

摘要:本文说明了某些 DHTML 功能对性能的重大影响,并提供了一些提高 DHTML 页面性能的技巧. 目录 简介 成批处理 DHTML 更改 使用 innerText 使用 DOM 添加单个元素 扩展 SELECT 元素中的选项 用 DOM 更新表 编写一次,使用多次 请勿过多使用动态属性 数据绑定很有效 不要在 document 对象中设置 expando 属性 避免切换类和样式规则 查找父项之前,先折叠文本范围 其他资料 简介 动态 HTML (DHTML) 在 Microsoft Int