• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 在ASP.NET 2.0中操作数据之六十九:处理Computed Columns列

在ASP.NET 2.0中操作数据之六十九:处理Computed Columns列

作者:heker2007 字体:[增加 减小] 来源:互联网 时间:2017-05-11

heker2007通过本文主要向大家介绍了computed columns,computed,computed tomography,vue computed,computed是什么意思等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

导言:

  Microsoft SQL Server里有一种computed columns列.这种列的值是通过一个表达式来计算,而表达式引用的是同一张表的其它列的值.打个比方,有一张ServiceLog表,其包含了ServicePerformed, EmployeeID, Rate, Duration等列. 虽然我们可以在一个web页面或其它什么界面里计算每笔服务的费用(也就是 比率 rate乘以时间段duration),不过我们也可以手动向ServiceLog表添加一个 AmountDue列以反映该信息.我们可以将该列创建为一个普通列,只是任何时候当Rate 或 Duration列的值发生改变时需要更新AmountDue列的值.一个比较好的办法是将AmountDue创建成一个computed column 列,其使用的表达式为 Rate * Duration. 这样,当在一个查询里引用该列时SQL Server就可以自动的计算AmountDue列的值.

  由于computed column列的值是由表达式决定的,所以这种列是只读的,并且不能在INSERT 或 UPDATE statements里对其赋值.然而,对使用ad-hoc SQL statements的TableAdapter来说,如果主查询里引用了computed column列,那么自动生成的INSERT 和 UPDATE statements也会自动的引用computed column列.所以,我们必须更新TableAdapter的 INSERT 和 UPDATE 查询,以及InsertCommand 和 UpdateCommand属性,以删除对任何computed column列的引用.

  如果在使用 ad-hoc SQL statements的TableAdapter里使用computed columns的话,我们要面临的挑战之一便是,每当完成TableAdapte设置向导时,TableAdapter的 INSERT 和 UPDATE查询都会自动的生成,又再一次的自动引用computed column列.不过如果TableAdapters使用存储过程的话,就不会出现这个问题.

  在本文,我们将向Northwind数据库的Suppliers表添加一个computed column列,然后相应地创建一个TableAdapter来处理该表以及该computed column列.我们将在TableAdapter里使用存储过程而不是ad-hoc SQL statements.

第一步:向Suppliers表添加一个Computed Column

  在本文,我们将向Suppliers表添加一个名为FullContactName的computed column列,它以“ContactName (ContactTitle, CompanyName)”的格式返回contact的name, title,以及所在的公司.

  打开服务器资源管理器,在Suppliers表上单击右键,选“Open Table Definition”,这将会显示出表所包含的列以及列的属性,比如数据类型、是否允许为NULL值等等.要添加一个computed column列,只需在表定义里键入表的名称,接下来在Column属性窗口的Computed Column Specification部分的(Formula)文本框里输入表达式(如图1所示)。将该computed column列命名为FullContactName,并使用下面的表达式:

ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN
 ContactTitle + ', ' ELSE '' END + CompanyName + ')'
</div>

  请注意,在SQL里可以用操作符“+” 来连接字符串。而CASE声明类似于传统编程语言里的条件语句。上面代码里的CASE 声明可以这样来理解:如果ContactTitle 不为NULL,那么输出ContactTitle值,再紧接一个逗号;如果为NULL,则无操作。关于CASE 声明的更多信息请参阅文章《The Power of SQL CASE Statements》(http://www.4guysfromrolla.com/webtech/102704-1.shtml)

  注意:除了CASE声明外,我们还可以使用ISNULL(ContactTitle, '')。语法ISNULL(checkExpression, replacementValue) returns是这样工作的,如果checkExpression 不为NULL,则对其进行返回;如果为NULL则返回replacementValue.虽然本文这2种语法都可以使用,但是在一些稍微复杂点的情况下,使用ISNULL的情况要多一些.添加完computed column列后,你的屏幕看起来应该和图1差不多:

http://files.weikejianghu.com/file_images/article/201605/2016051910262344.png
图1:向Suppliers表添加一个名为FullContactName的Computed Column列

  添加完后点工具栏上的Save图标,或按Ctrl+S键,又或者在File菜单里选“保存Suppliers”.“保存”操作会自动地刷新服务器资源管理器,将刚刚添加的的列展现在Suppliers表里.此外,键入到(Formula)文本框的表达式会自动的进行调整,剔除不必要的空白,将列名用[]括起来,并使用圆括号()来显示操作的先后顺序:

(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL
 then [ContactTitle]+', ' else '' end)+[CompanyName])+')')
</div>

  关于Microsoft SQL Server里computed columns列的更多信息请参考文章《technical documentation》(http://msdn2.microsoft.com/en-us/library/ms191250.aspx);同时你也可以参考文章《How to: Specify Computed Columns》(http://msdn2.microsoft.com/en-us/library/ms188300.aspx),看如何一步步地创建computed columns列.

  注意:默认情况下,数据库表并没有“实际”(physically)的包含computed columns列,而是每次在一个查询里引用它时重新计算其值.不过,我们可以选择“Is Persisted”选项来让SQL Server实实在在的在数据库表里创建computed columns列.这样的话我们可以为computed column列创建一个索引,当在一个查询的WHERE字句里使用computed column列的值时就可以提高执行效率.更多的信息请参阅文章《Creating Indexes on Computed Columns》(http://msdn2.microsoft.com/en-us/library/ms189292.aspx)

第二步:查看Computed Column列的值

  在处理数据访问层前,让我们花点时间查看FullContactName列的值.在服务器资源管理器里,在Suppliers表上右键单击,选择“New Query”,这将启动一个查询窗口提示我们在查询里包含哪个表.添加Suppliers表,再点“Close”.接下来从Suppliers表里选择CompanyName, ContactName, ContactTitle,以及FullContactName列.最后,点击工具栏上的红色感叹号图标执行查询,查看结果.如图2所示,结果里包含了FullContactName列,它以ContactName (ContactTitle, CompanyName)”的格式使用了CompanyName, ContactName,ContactTitle这3列.

http://files.weikejianghu.com/file_images/article/201605/2016051910262345.png
图2:FullContactName列的格式为“ContactName (ContactTitle, CompanyName)”

第三步:在数据访问层添加一个SuppliersTableAdapter

  为了在我们的应用程序里处理supplier信息,我们首先需要在DAL层创建一个TableAdapter 和 DataTable.我们可以用前面的教程探讨的方法来进行创建,稍微不同的是我们将要与computed columns列打交道.

  如果你用ad-hoc SQL statements来构造一个TableAdapter的话,你可以很简单的通过TableAdapter设置向导在TableAdapter的主查询里引用computed column列,这样,在自动生成的INSERT 和 UPDATE statements就会引用computed column列。如果你执行这2个方法的话,将会抛出这样的一个SqlException:“The column ‘ColumnName' cannot be modified because it is either a computed column or is the result of a UNION operator”.虽然我们可以在InsertCommand和UpdateCommand属性里手工改动INSERT 和 UPDATE statement,但是一旦重新运行TableAdapter设置向导后,我们所做的用户定制就会丢失掉.

  由于使用ad-hoc SQL statements的TableAdapters的这种不稳定性,我们倾向于使用存储过程来处理computed columns列.如果你使用的是现有的存储过程的话,你可以参阅第66章《在TableAdapters中使用现有的存储过程》那样来配置TableAdapter.如果你使用TableAdapter设置向导来创建存储过程的话,很重要的一点是最开始,你不要在主查询里引用computed columns列,如果你在主查询里引用了computed columns列的话,你刚完成设置,向导就会提示你不能创建相应的存储过程.简而言之,在设置TableAdapter时,最开始不要在主查询里引用computed column列,接下来再对相应的存储过程和TableAdapter的SelectCommand属性进行更改以引用computed column列.这种方法我们在第67章《在TableAdapters中使用JOINs》里探讨过.

  本文我们将新添加一个TableAdapter并自动创建存储过程.当然我们要在主查询里忽略这个名为FullContactName的computed column列.打开~/App_Code/DAL文件夹里的NorthwindWithSprocs DataSet数据集,在设计器里右键单击,选“add a new TableAdapter”,这将开启TableAdapter设置向导,指定数据库连接信息(也就Web.config文件里的NORTHWNDConnectionString),点Next。选“Create new stored procedures”项,再点Next.

http://files.weikejianghu.com/file_images/article/201605/2016051910262346.pn
<script async src=

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 在ASP.NET 2.0中操作数据之六十九:处理Computed Columns列

相关文章

  • 2017-05-11Repeater控件与PagedDataSource结合实现分页功能
  • 2017-05-11使用Fiddler调试visual studion多个虚拟站点的问题分析
  • 2017-05-11将.aspx转换为.htm的两种方法
  • 2017-05-11ASP.NET+XML打造网络硬盘原理分析
  • 2017-05-11Asp.net "对路径的访问被拒绝" 解决方法的分析
  • 2017-05-11详解ASP.NET与ASP.NET Core用户验证Cookie并存解决方案
  • 2017-05-11通过VS中的数据源选择对话框简单实现数据库连接配置
  • 2017-05-11利用ASP.NET MVC和Bootstrap快速搭建个人博客之后台dataTable数据列表
  • 2017-05-11asp.net 使用事务
  • 2017-05-11精通ASP.NET中弹出窗口技术

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 把字符串转为HtmlTable演示动画
    • asp.net网站安全从小做起与防范小结
    • 读取TXT文件内容的方法
    • WPF实现转圈进度条效果
    • 解析ABP框架中的数据传输对象与应用服务
    • asp.NET 脏字过滤算法 修改版
    • ASP.NET热点问题解答14个
    • Convert.ToInt32与Int32.Parse区别及Int32.TryParse
    • Ajax实现异步刷新验证用户名是否已存在的具体方法
    • 基于ASP.NET+easyUI框架实现图片上传功能(表单)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有