• 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中操作数据之六十七:在TableAdapters中使用JOINs

在ASP.NET 2.0中操作数据之六十七:在TableAdapters中使用JOINs

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

heker2007通过本文主要向大家介绍了datasettableadapters,no network adapters,getadaptersaddresses,display adapters,adapters是什么意思等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

导言:

  在关系数据库里,我们处理的数据通常跨越了几个数据表。举例:当展示产品信息时我们很可能想列出每个产品相应的category以及供应商的名称等.诚然,Products表里包含有CategoryID 和SupplierID值,但是事实上的category以及supplier names分别定义在Categories表和Suppliers表里. 要从其它的相关表里获取信息,我们可以使用correlated subqueries或JOINs.一条correlated subquerie就是一个镶套的SELECT,引用外部查询(outer query)的列.比如在第一章《创建一个数据访问层》里我们在ProductsTableAdapter的主查询里使用2条correlated subqueries来返回每个产品的category 以及supplier names.而JOIN是一SQL构造,将2个不同的表的相关联的rows进行合并.在第46章《使用SqlDataSource控件检索数据》里,我们使用JOIN来显示每个产品的category信息.

  我们避免在TableAdapters里使用JOIN是由于TableAdapter向导自动生成的INSERT, UPDATE,以及DELETE statements有其局限性.具体来说,如果TableAdapter的主查询里包含了任何的JOIN,那么TableAdapter就不能为它的InsertCommand, UpdateCommand,以及DeleteCommand属性自动地创建 ad-hoc SQL statements或存储过程.在开始之前,我们先简要地对correlated subqueries和JOIN进行比较.

比较Correlated Subqueries和JOINs

  我们知道在第一章的Northwind DataSet数据集里创建的ProductsTableAdapter使用correlated subqueries来返回每个产品对应的category 和 supplier name。该ProductsTableAdapter的主查询如下:

SELECT ProductID, ProductName, SupplierID, CategoryID,
 QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
 ReorderLevel, Discontinued,
 (SELECT CategoryName FROM Categories WHERE Categories.CategoryID =
  Products.CategoryID) as CategoryName,
 (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID =
  Products.SupplierID) as SupplierName
FROM Products

</div>

  我们注意这2个correlated subqueries——“(SELECT CategoryName FROM Categories WHERE Categories.CategoryID = Products.CategoryID)” 以及“(SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID),都是一个SELECT查询,返回一个单一值,并作为外部SELECT statement的额外的列.

  此外,我们可以使用JOIN来返回每个产品的supplier 以及category name,下面的查询与上面的代码效果一样,不过用的是JOIN:

SELECT ProductID, ProductName, Products.SupplierID, Products.CategoryID,
 QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
 ReorderLevel, Discontinued,
 Categories.CategoryName,
 Suppliers.CompanyName as SupplierName
FROM Products
 LEFT JOIN Categories ON
 Categories.CategoryID = Products.CategoryID
 LEFT JOIN Suppliers ON
 Suppliers.SupplierID = Products.SupplierID
</div>

  JOIN基于某种标准将一个表的记录与另一个表的记录合并起来.比如上述代码中,“LEFT JOIN Categories ON Categories.CategoryID = Products.CategoryID”就指示SQL Server将每一条product记录与category记录合并起来,标准是category记录的CategoryID值与product记录CategoryID值相吻合.在合并的结果里,我们可以对每个产品相应的category fields进行处理(比如CategoryName).

  注意:JOIN通常用来从相关的数据库查询数据.如果你对JOIN语法比较陌生或者对其用法复习提高,我推荐你阅读W3 Schools论坛上的文章《SQL Join tutorial》(http://www.w3schools.com/sql/sql_join.asp);此外你还可以阅读SQL Books Online的《JOIN Fundamentals》和《Subquery Fundamentals》部分.

  当使用类型化的数据集(Typed DataSets)来构建数据访问层时,使用correlated subqueries要好一些。具体来说,如果主查询里包含任何的JOIN时,TableAdapter的设置向导就不会自动生成相应的INSERT, UPDATE, 以及DELETE statements.相反,使用correlated subqueries的话就可以.

  为验证这一点,我们在~/App_Code/DAL文件夹里创建一个临时的类型化的数据集.在TableAdapter设置向导里选择使用ad-hoc SQL statements,并键入如下的SELECT查询(如图1):

SELECT ProductID, ProductName, Products.SupplierID, Products.CategoryID,
 QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
 ReorderLevel, Discontinued,
 Categories.CategoryName,
 Suppliers.CompanyName as SupplierName
FROM Products
 LEFT JOIN Categories ON
 Categories.CategoryID = Products.CategoryID
 LEFT JOIN Suppliers ON
 Suppliers.SupplierID = Products.SupplierID
</div>

http://files.weikejianghu.com/file_images/article/201605/2016051909322017.png
图1:键入一个包含JOIN的主查询

  默认情况下,TableAdapter在主查询的基础上自动地创建INSERT, UPDATE, 以及DELETE statements.如果你点击“Advanced”按钮的话,你将看到该功能是激活的.不理会这些设置的话,TableAdapter将不能创建INSERT, UPDATE,以及DELETE statements因为主查询包含了JOIN.

http://files.weikejianghu.com/file_images/article/201605/2016051909322018.png
图2:键入一个包含JOIN的主查询

  点Finish完成向导。此时在DataSet设计器里将只包含一个TableAdapter,其包含的DataTable列出了SELECT查询返回的列.包括CategoryName 和 SupplierName,如图3所示.

http://files.weikejianghu.com/file_images/article/201605/2016051909322019.png
图3:DataTable包含了返回的列

  此外,TableAdapter的InsertCommand, UpdateCommand, 和DeleteCommand属性为空。你可以在设计器里选中TableAdapter,查看属性窗口.你将看到InsertCommand, UpdateCommand, 和DeleteCommand属性设置为“(None)”.

http://files.weikejianghu.com/file_images/article/201605/2016051909322020.png
图4: InsertCommand, UpdateCommand,DeleteCommand属性为“(None)”

  为了验证该缺点,我们可以通过属性窗口为InsertCommand, UpdateCommand,以及 DeleteCommand属性手动写入SQL statements以及参数.最开始我们可以设置TableAdapter的主查询不包含任何JOIN,这将允许自动生成INSERT, UPDATE,以及DELETE statements.完成向导设置后,我们可以通过属性窗口手动修改TableAdapter的SelectCommand以包含JOIN语法.

  虽然这种方法工作正常,但很脆弱.因为我们可以在任何时候通过向导设置重新设置主查询,重新自动生成INSERT, UPDATE,以及DELETE statements.这意味着我们刚刚进行的用户定制可以很容易地就被丢失了.

  好在TableAdapter自动生成的INSERT, UPDATE,以及DELETE statements的脆弱性仅仅针对ad-hoc SQL statements而言.如果你的TableAdapter使用的是存储过程的话,你可以自定义SelectCommand, InsertCommand, UpdateCommand,或DeleteCommand存储过程.重新运行TableAdapter设置向导时不用担心存储过程会被修改.

  在接下来的几个步骤里我们将创建一个TableAdapter,最初我们使用一个不含JOIN的主查询,以便自动生成相应的insert, update,和delete存储过程.接着,我们将更新该SelectCommand以使用JOIN来从相关表返回额外的列. 最后,我们将创建一个对应的Business Logic Layer class类,在ASP.NET页面上使用该TableAdapter.

第1步:使用简单的主查询创建一个TableAdapter

  在本文,我们将为NorthwindWithSprocs DataSet数据集的Employees表添加一个TableAdapter以及一个强类型的DataTable.该Employees表包含一个ReportsTo列,它指定了该雇员的经理的EmployeeID值.比如:雇员Anne Dodsworth的ReportTo值为5,也就是Steven Buchanan的EmployeeID值.因此,雇员Anne Dodsworth的经理就是Steven Buchanan.除了返回每个雇员的ReportsTo值外,我们也想返回他们经理的名字.为此,我们可以使用JOIN.但是我们知道,在最初创建TableAdapter时使用JOIN的话向导将不能够自动生成相应的insert, update,delete属性. 因此,我们在最初创建 TableAdapter的时候不在其主查询里包含任何的JOIN.在第2步里,我们将对主查询存储过程进行更新,通过使用JOIN来获取经理的名字.

  我们打开~/App_Code/DAL文件夹里的NorthwindWithSp

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

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

  • 在ASP.NET 2.0中操作数据之六十七:在TableAdapters中使用JOINs

相关文章

  • 2017-05-11Asp.net利用JQuery AJAX实现无刷新评论思路与代码
  • 2017-05-11asp.net 实现静态页面累加访问量的三种方式
  • 2017-05-11Asp.net自定义控件之加载层
  • 2017-05-11ASP.NET WebAPi(selfhost)实现文件同步或异步上传
  • 2017-05-11使用 ServiceStack.Text 序列化 json的实现代码
  • 2017-05-11Visual Studio快速开发以及Visual Studio 2010新功能介绍
  • 2017-05-11C# 可空类型分析
  • 2017-05-11.net读取Rss转换为DataTable
  • 2017-05-11ASP.NET Gridview与checkbox全选、全不选实现代码
  • 2017-05-11在ASP.NET 2.0中操作数据之五十五:编辑和删除现有的二进制数据

文章分类

  • 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与数据库相关技巧
    • VS2012/VS2013本地发布网站步骤详解
    • asp.net5中用户认证与授权(2)
    • ASP.NET Core缓存静态资源示例详解
    • 如何对ASP.NET网站实现静态化
    • ASP.NET创建三层架构图解详细教程
    • Microsoft Visual Studio 2017 for Mac Preview安装使用案例分享
    • C#反射实例学习及注意内容
    • VB.NET拷贝整个目录下所有子目录及文件的实例代码

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

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