佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

搜索
查看: 1190|回复: 6

[.Net]Stateless 资料更新时, 与当时资料库的同record 的比较

[复制链接]
发表于 23-10-2007 10:22 AM | 显示全部楼层 |阅读模式
简略说明。

网络资料库程序一般来说都是stateless data , 也就是说, 从资料库取了资料, 显示给使用者。

这里以 A,B,C 来代表几个某个record 的情况

A = 刚从资料库取出的情况
B = 使用者修改后的情况
C = 当使用者修改后, submit 上去时, 资料库同一笔record 的情况


当我们把资料显示给使用者, 让使用者修改,在更新时, 就会出现几种情形。

B 被submit 上去, C = A    -> 这个没有问题。
B 被submit 上去, C != A   -〉这个大问题, 因为被修改的资料, 被更新了。



听说 ADO.Net 本身有这样的机制, 但是如果我们是自己写BusinessObject 和 Data Access Layer , binding 在ObjectDataSource 的话, 这个机制是否会被启动?

如果否, 那么, 要如何用SQL 和 C# 的方式来达到这个机制。

多多指教。
回复

使用道具 举报


ADVERTISEMENT

阿牙木 该用户已被删除
发表于 25-10-2007 09:25 AM | 显示全部楼层
如果你是使用SQL SERVER 2005和.NET 2.0 (我相信是啦,看你的应用论坛那里的问题),
就可以很简单的做到.不过如果要用.NET内置的话,相当程度上要放弃在STORED PROCEDURE里放一些LOGIC的做法了.

方法是,你的BUSINESS OBJECT必须使用STRONGLY TYPED DATASET (在VS里就是一个.XSD FILE), 当你BIND 去DATABASE的时候, 你可以选择CREATE A NEW STORED PROCEDURE.

在这个WIZARD里有个ADVANCED OPTION,里头你可以找到一个叫OPTIMISTIC CONCURRENCY (你可以查找这方面的资料) 的选项,若点选它的话,它所帮你生成的STORED PROCEDURE就会有你以上所述的作用了.

问题是在于,它是整个TABLE来算的,
也就是说,如果你有一个TABLE叫CustomerDetails, 所有里面的Field都会被拿来比较VALUE.
回复

使用道具 举报

 楼主| 发表于 26-10-2007 08:06 PM | 显示全部楼层
原帖由 阿牙木 于 25-10-2007 09:25 AM 发表
如果你是使用SQL SERVER 2005和.NET 2.0 (我相信是啦,看你的应用论坛那里的问题),
就可以很简单的做到.不过如果要用.NET内置的话,相当程度上要放弃在STORED PROCEDURE里放一些LOGIC的做法了.

方法是,你的BU ...


谢谢你的回复。

这正是我想要作到的, 但是, 我不是用 MSSQL server , 公司的资料库是冷门资料库, 而且现在是用 ODBC 来连接。

基本上已经放弃了Stored Procedure 的方式,因为该冷门资料库不支援Stored Procedure, 所以想用Transaction scope + Mutex + DataSet + SQL 来达到。 DataSet 里面应该同时有收藏原来版本A,跟版本 B 。 只是 SQL 好像不能 return  bool 。。 , 真有点头疼。
回复

使用道具 举报

阿牙木 该用户已被删除
发表于 27-10-2007 02:17 AM | 显示全部楼层
哦,那就麻烦了,ODBC不职员 optimistic concurrency.
让我来想想...

DATASET里的确收藏了不同的ROWSTATE, 你可以用这个来拿到版本A与版本B,
你就要自己写咯, 就是 SELECT OneColumn FROM OneTable WHERE OneValue = 'orignalOneValue' AND AnotherValue = 'orignalAnotherValue' AND ....

每个COLUMN都去比对, 应该是最讨厌的方法了咯. 呵呵.
回复

使用道具 举报

发表于 28-10-2007 09:35 PM | 显示全部楼层
还有一个偷鸡方法,每一个table弄一个int column,每次update/insert 都+1,那么只要比对这个column就知道资料有没有被改过。
虽然有一点小小小小小小的瑕疵,但是还是可以用啦呵呵
回复

使用道具 举报

阿牙木 该用户已被删除
发表于 29-10-2007 03:04 PM | 显示全部楼层
老大你这个方法太有创意了,我下次一定要用!!!!!
回复

使用道具 举报

Follow Us
发表于 1-11-2007 08:25 PM | 显示全部楼层
Spring Framework .NET内有针对ADO.NET所设计的Transaction Management的类可以调用。

http://www.springframework.net
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT


本周最热论坛帖子本周最热论坛帖子

ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2026 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 23-5-2026 03:45 AM , Processed in 0.066147 second(s), 15 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表