ObjectDataSource并发CompareALLValues处理

  我们在使用SqlDataSource进行并发策略的时候比较容易实现,通过设置ConflictDetection值为CompareAllValues,OldValuesParameterFormatString="original_{0}"就可以在SelectCommand,UpdateCommand,DeleteCommand里面进行设置即可。 设计Account(AccountID,AccountUse ,Flag)数据库表 这里以UpdateCommand为例:

update set AccountUse=@AccountUseFlag=@Flag where AccountID=@original_AccountID and AccountUse=@Original_AccountUse and Flag=@Original_Flag;这样可以很容易地进行SqlDataSource的并发处理。

  然而ObjectDataSource为我们提供了并发控制机制:
ObjectDataSource 控件有一个属性ConflictDetection,可以设置应用程序中并发处理。

ConflictDetection 也有两个可选值:

默认设置为OverwriteChanges 这是最小化的并发冲突设置,在更新和删除的时候不会提供原始数据信息,无法进行并发控制.  
CompareAllValues 这将给予你最大的灵活性,它将在更新和删除的时候提供原始的数据信息,所以可以进行并发控制。
请看如下示例:
用于ObjectDataSource的实体对象类Account类:

ContractedBlock.gif ExpandedBlockStart.gif Account实体类
 1  public class Account
 2ExpandedBlockStart.gifContractedBlock.gif    {
 3        //public int AccountID;
 4        //public string AccountUser;
 5        //public int Flag;
 6
 7        public System.Data.DataSet getData()
 8ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 9            SqlConnection con = new SqlConnection("server=.;database=BSMM;uid=sa;pwd=2;");
10            SqlCommand cmd = new SqlCommand("SELECT  [AccountID],[AccountUse],[Flag] FROM [BSMM].[dbo].[Account] ",con);
11            SqlDataAdapter sda = new SqlDataAdapter(cmd);
12            System.Data.DataSet ds = new System.Data.DataSet();
13            sda.Fill(ds,"Account");
14            return ds;
15        }

16
17        public int update(int AccountID, string AccountUse, int Flag, int original_AccountID, string original_AccountUse, int original_Flag)
18ExpandedSubBlockStart.gifContractedSubBlock.gif        {
19            SqlConnection con = new SqlConnection("server=.;database=BSMM;uid=sa;pwd=2;");
20            SqlCommand cmd = new SqlCommand("update Account set AccountUse='" + AccountUse + "',Flag=" + Flag + " where AccountID=" +
21            original_AccountID + " and AccountUse='" + original_AccountUse + "'", con);
22            con.Open();
23            int i = cmd.ExecuteNonQuery();
24            con.Close();
25            return i;
26
27        }

28
29
30    }

 

对于Update方法:

ObjectDataSource在ConflictDetection= Overwrite Changes的时候要求只把现在更新的字段,以及原来的主键字段(这个名字是根据ObjectDataSource的OldValuesParameterFormatString设置的格式Original_{0}),例如Original_AccountID传进来,以便索引到更新行。

ObjectDataSource在ConflictDetection=CompareALLValues的时候要求把现在更新的字段以及原来的所有字段全部传递进来。

ObjectDataSource在DataObjectType设置的情况下,ConflictDetection= Overwrite Changes的时候,仅仅需要一个Account对象变量作为参数,代表更新的值。

ObjectDataSource在DataObjectType设置的情况下,ConflictDetection=CompareALLValues的时候,需要两个Account对象作为参数,前一个变量Account acc,后一个变量Account Origina_acc,后一个变量记录了原始值。

对于Delete方法:

ObjectDataSource在ConflictDetection= Overwrite Changes的时候,只会把Original_AccountID的字段传递过来。

ObjectDataSource在ConflictDetection=CompareALLValues的时候要求把Original_AccountID ,Original_AccountUse和Original_Flag全部传递过去。

ObjectDataSource在DataObjectType设置的情况下,仅仅需要传递一个Account类型的变量就可以了。

如下表所示:

命令

DataObjectType

ConflictDetection

OldValuesParameterFormatString

ObjectDataSource的实体对象类Account类提供的方法

Update

没有设置

Overwrite Changes

Original_{0}

update(int AccountID,string AccountUse,bool Flag,int Original_AccountID)

 

没有设置

CompareAllValues

 

Original_{0}

Update(int AccountID,string AccountUse ,bool Flag,int Original_AccountID, string Original_AccountUse,bool Original_Flag)

 

设置

Overwrite Changes

Original_{0}

Update(Account acc)

 

设置

CompareAllValues

 

Original_{0}

Update(Account acc,Account Orignal_acc)

Delete

没有设置

Overwrite Changes

Original_{0}

Delete(int Original_AccountID)

 

没有设置

CompareAllValues

 

Original_{0}

Delete(int Original_AccountID,string Original_AccountUse,bool Original_Flag)

 

设置

Overwrite Changes

Original_{0}

Delete(Account acc)

 

设置

CompareAllValues

 

Original_{0}

Delete(Account acc)

 

转载于:https://www.cnblogs.com/baozi/archive/2009/10/19/1586158.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值