ObjectDataSource配合存储过程(采用数据集)的使用(删除可以解决,但是编辑出错好像它的方法也无法解决
原文发布时间为:2008-08-01 —— 来源于本人的百度文章 [由搬家工具导入]
ObjectDataSource是比较有意思的一个东西
通过在网络上遍访各位高手,终于自己有了一些心得体会。现总结如下:
1、ObjectDataSource的作用是给页面的数据展示控件提供数据
2、ObjectDataSourc是一个媒介,它一手拉着界面的数据展示控件,一手拉着实际的数据来源。它自己什么都不是,仅仅是一个中介。
3、之所以它叫ObjectDataSource,是因为它不像AccessDataSource和SQLDataSource那样是直接连到了数据库,而是连到一个特殊的对象。有DataObjectAttribute()属性的对象
4、因此,利用ObjectDataSource完成的数据访问方案很容易做到3层架构了。ASPx页面控件层(UI)、数据对象层(BLL)[订正: (BLL)业务逻辑层]、数据访问层(DAL)
但是平时我们的各种项目,并不是都很大型的。对于众多中小型项目来说,并没有特别特殊或复杂的BLL(业务逻辑层).我们使用的仅仅是增、删、改、查这些基本功能。因此的确没有特别的必要硬弄个什么业务层出来。
但是这种情况下,如果满世界的去使用方便的SQLDataSource或者AccessDataSourc会导致数据查询功能被散布在整个页面间。并且如果有多个页面的查询完全相同也无法做到组建重用。总之往高了说违反OO精神,小了说代码维护难度太大。
因此我总结了一个结合.net2.0特有的TableAdapter对象和ObjectDataSource组和使用的方式来解决这个问题
简单说,利用.net2.0的TableAdapter对象的特性,在项目中自动生成一个XXTableAdapters的命名空间,里面包含了本项目所有用到的数据访问对象和方法。在页面上使用ObjectDataSourc对象来引用这些数据访问对象,自动生成的TableAdapter对象本身就是具有DataObjectAttribute()属性的对象。这样就做到了一个较为集中的数据访问层的实现,以及页面和数据访问层的分离。这时候加上ASP.net本身就具有的表示层页面和CodeBehind(代码后置)的特性,可以说基本实现了所谓的三层构架。严格说可能只有业务外观层(BizFaced).没有业务逻辑层,[订正:只有Business Facade,没有Business Rule.],或者说业务逻辑层非常简单而已。
个人觉得这么样子已经可以解决大多数的项目了
下面具体介绍实现步骤:
1、创建ASP.net 网站。不是项目哦。虽然不影响实际操作,但网站和Web项目实际是有所不同的。

2、在项目App_Data文件夹内新建SQL2005数据库
![]()
3、创建表TestTable:ID int identity PK,UserName char(50) not null 然后放入一些数据

4、数据输入完成后,在App_Code文件夹内添加DataSetSQL.xsd

5、在自动运行的向导内配置访问数据库文件DatabaseTest,并读取里面的TestTable
前文有具体讲解如何进行详细的配置,请参考:
可以在向导中选择自动生成存储过程,这个东西能提高站点运行性能,该用还是用的好,再说又不麻烦。

6、由于是SQL数据库,许多高级特性都可以在这里使用。会用的同学们就多用用好了。

7、命名新的存储过程

8、关键步骤!!!!这里的后两个复选框对我们用ObjectDataSourc对象来访问TableAdapter至关重要,因此是必选的

配置过程完成了

此时如果选中TableAdapter来查看属性的话能看到这种情况。4个命令都已经配置完成,且都拥有各自的Parameters集合

接下来在Default.aspx页面上增加一个GridView

选择新建数据源

使用对象作为数据源,然后选择TableAdapters里面的对应的TableAdapter

分别选择对应的方法

完成后可以运行程序看看


赫赫,数据已经出来了。下面回到Default.aspx页面为GridView添加编辑和删除按钮

也可以使用下面这两个属性来添加编辑和删除。不过两种方法竟然不同步,各自管自己哦。

然后再次运行程序,点编辑和删除试试?

我执行的结果是删除白点,更新出错
问题在哪里呢?
1、由于我在生成TableAdapter的时候使用了开放式并发,因此在更新和删除的存储过程中需要原始数据进行验证。
2、DataObjectSource控件有一个属性用于指定如何解决数据冲突,简单说就是是否支持开放式并发。
MSDN:通过将 ObjectDataSource 控件的 ConflictDetection 属性设置为 true,可以指定 ObjectDataSource 控件应该包括调用源数据对象的更新方法时的原始值。此后,这些原始值可以包括在开放式并发检查中。有关更多信息,请参见对 ObjectDataSource 控件使用参数。有关开放式并发检查的信息,请参见使用开放式并发。
因此,修改DataObjectSource控件属性如下

再次运行,删除操作完成了,但是更新依然不正确
继续找问题?从前面的错误信息页可以推理,需要调用一个有三个参数的Update方法,而实际上没有。通过检查ObjectDataSouceSQL控件的配置信息发现我们指定的Update是有4个参数的。比较后少了一个ID字段。
具体的原因还没有弄仔细,不过发生的源头是因为GridView控件不会返回现有的ID值。很明显哦,ID是主关键字列,不允许编辑的。因此自然没有当前值,只有原始值。不过这个问题最好微软能解决以下,否则都要我们自己来改代码不太麻烦了哦。
这个时候如果将ID列的ReadOnly属性设为false,整个程序就可以运行了。不过这不应该的阿。
我的解决方案是修改存储过程,例如原始自动生成的如下:
ALTER PROCEDURE dbo.TestTableUpd
(
@UserName nvarchar(50),
@Original_ID int,
@Original_UserName nvarchar(50),
@ID int
)
AS
SET NOCOUNT OFF;
UPDATE [TestTable] SET [UserName] = @UserName WHERE (([ID] = @Original_ID) AND ([UserName] = @Original_UserName));
SELECT ID, UserName FROM TestTable WHERE (ID = @ID)
由于ID不进行编辑,因此原始ID就是现有ID。另外如果不需要这么强劲的开放并发冲突检验,也可以进一步简化代码。
修改后如下,其实只要修改最后那个select中的部分。从这里也可以看出如果生成时不选择更新后刷新数据集也不会有这个问题
ALTER PROCEDURE dbo.TestTableUpd
(
@UserName nvarchar(50),
@Original_ID int,
@Original_UserName nvarchar(50)
)
AS
SET NOCOUNT OFF;
UPDATE [TestTable] SET [UserName] = @UserName WHERE (([ID] = @Original_ID) AND ([UserName] = @Original_UserName));
SELECT ID, UserName FROM TestTable WHERE (ID = @Original_ID)
在VS2005内修改存储过程

不过存储过程修改后,参数发生了变化,这时候需要重新配置TableAdapter

检查参数是不是新的了

完成以后再到Default.aspx页面重新配置ObjectDataSourcSQL

修改完毕后再次执行。应该都正确了。
总结:
1、在DataSet使用TableAdapter向导时可以自动生成4种基本查询语句,因此没必要自己写
2、由于GridView不能返回当前版本的主关键字,因此在更新查询中要手动修改有关语句。但是如果不使用更新后刷新数据集则不需要这个操作。在本例子中其实只是简单的进行表格的输入和输出,最早的出发点也是想用于小型的应用。因此如果不采用刷新数据集则可以更加简单。
3、由于ObjectDataSourc控件调用的TableAdapter控件中方法需要名称对应,因此GridView是如何返回多个值呢?它自己能保存值的多个状态,在传递给ObjectDataSourc时,ObjectDataSourc通过OldValueParameterFormatString属性来给参数添加前缀,总之参数的名字要统一的。

4、估计很多可以和ObjectDataSourc绑定的界面控件都可以这么来使用。
5、其实还有很多细节的,不过一来我也不一定能都说清楚,二来大家可以自己尝试。本贴到此结束。
希望对大家有所帮助
ObjectDataSource配合存储过程(采用数据集)的使用(删除可以解决,但是编辑出错好像它的方法也无法解决的更多相关文章
- Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例
Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13| 分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...
- oracle存储过程返回数据集结果
MSSQL的存储过程返回数据集好简单,直接SELECT 就可以. ORACLE的存储过程返回数据集必须通过游标. 创建ORACLE存储过程 create or replace procedure cx ...
- 123 c#调用oracle存储过程返回数据集 --通过oracle存储过程返回数据集
c#调用oracle存储过程返回数据集 2008-12-20 10:59:57| 分类: net|字号 订阅 CREATE OR REPLACE PACKAGE pkg_tableTypeIS ...
- c#调用oracle存储过程返回数据集
c#调用oracle存储过程返回数据集 2008-12-20 10:59:57| 分类: net|字号 订阅 CREATE OR REPLACE PACKAGE pkg_tableTypeIS ...
- SQL Server中使用msdb数据库的存储过程sp_delete_backuphistory和sp_delete_database_backuphistory来删除备份和恢复历史数据
根据微软文档对sp_delete_backuphistory存储过程的介绍,SQL Server在每次备份和恢复数据库后,会向msdb系统数据库的备份和恢复历史表写入数据,如果SQL Server经常 ...
- wex5 实战 苹果左滑删除与长按编辑
用了多年苹果,习惯了苹果的左滑删除与长按编辑,特别是短信什么的,很多安卓界面也采用了类似方式. 我的想法突如其来,用wex5也设计一个这样的功能,可以吗? 那句广告词,没有什么不可能. 呵呵. 一 ...
- 批量删除wps文档里的回车符的方法!WPS使用技巧分享!
有时候整理文档的时候,如果是从网上复制的文字,可能会因为复制而产生很多的回车符.怎样能批量去掉这些个回车符呢,下面马上告诉你批量删除wps文档里的回车符的方法!WPS使用技巧分享! 想要批量删除批量删 ...
- php删除多重数组对象属性,重新赋值的方法
php删除多重数组对象属性,重新赋值的方法 实例:sphinx搜索出来的结果,要去掉某个属性值:$cl = new SphinxClient ();$query = $cl->Query ( $ ...
- sql语句删除由于无主键导致完全重复的数据方法
sql语句删除由于无主键导致完全重复的数据方法 select distinct * into #Tmp from t_column drop table t_column select * into ...
随机推荐
- 用NSCoding协议完成“编码/解码”操作-Object-C
Archiving Objective-C Objects with NSCoding For the seasoned Cocoa developer, this is a piece of cak ...
- 签名ipa,让其它手机也安装
开发的时候,需要将app让其它人装上测试,虽然通过xcode可以使用编译进去,但是仍显不方便. 网上有个工具, http://code.google.com/p/iresign/ 通过这个工具,使用自 ...
- k8s集群介绍
Kubernetes集群组件 一个典型的Kubernetes集群由多个工作节点和一个集群控制节点,以及一个集群状态存储系统etcd组成.其中Master节点负责整个集群管理工作,为集群提供管理接口,并 ...
- React初识整理(一)
一.React的特点 1.自动化的UI状态管理:自动完成数据变化与界面效果的更新. 2.虚拟DOM:创建1个虚拟的dom节点树,放在内存里(内存修改数据效率高),数据变化时先修改内存里的虚拟DOM,然 ...
- 【dp】拔河比赛
01背包:感谢ZCK大佬 题目描述 学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近. 输入 输入中 ...
- python中函数定义之实参、形参
一般在函数的定义中,会有一类变量---形参,它是函数完成其工作的一项信息.实参往往是调用函数时传递给函数的信息.我们在调用函数时,将要让函数使用的信息放在括号内.例如定义一个函数def greet_u ...
- 蓝牙学习 (6) - Play with TI sensorTag (1)
硬件 cc2650 SensorTag Connect with App 在手机上安装Ti提供的sensorTag App即可和sensorTag 建立连接. 如下手机截图,
- Python之写入文件(1)
一.写入文件 保存数据也是在各个编程语言中常用的操作,将数据写入到文件中是常用的操作,你可以将程序运行中的一些临时输出保存至文件中,以便后续打开文件查看,也可以把这些文件读入程序中来操作其中的数据. ...
- Python从文件中读取数据(2)
一.读取文件中各行的内容并存储到一个列表中 继续用resource.txt 举例 resource.txt my name is joker, I am 18 years old, How about ...
- Hive 执行sql命令报错
Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxExce ...