OldValuesParameterFormatString 有何用处

对asp.net中数据源控件如何为数据绑定字段创建参数的理解

看到Chris Hart写的asp.net 2.0 入门经典中关于数据绑定控件的DataKeyNames属性的解释,感到有些疑惑
书中讲DataKeyNames存在的目的是为了保存某一字段的旧值和新值以便可以正确地执行写入
比如可以通过DataKeyNames保存主键的旧值和新值实现更改数据表中的主键字段(见书中240页)
当时一时不能理解是怎么实现的,按照书上的实例构建完了一个可以删除记录的数据源控件和数据绑定控件的组合
发现在数据绑定控件里面自动添加了一个DataKeyNames属性,值是我所用的表的主键字段,
可按照设置向导的设置却没有能够打开对主键的编辑功能
看代码,看到数据绑定控件里面有主键的那一行里面有个ReadOnly属性,删之,浏览网页,可以编辑了,但结果不能保存
再看代码,发现数据源的更新命令里面set部分就没有对主键字段的更新
自动生成的更新命令是这样的
UpdateCommand="UPDATE [Gallery] SET [FixtureID] = @FixtureID, [UploadedByMemberName] = @UploadedByMemberName, [Notes] = @Notes, [PictureURL] = @PictureURL WHERE [PictureID] = @PictureID">
其中[PictureID]是主键
然后就在数据源的设置向导自动生成的代码中我自己添加了对主键的修改
变成了这样
UpdateCommand="UPDATE [Gallery] SET [PictureID] = @PictureID, [FixtureID] = @FixtureID, [UploadedByMemberName] = @UploadedByMemberName, [Notes] = @Notes, [PictureURL] = @PictureURL WHERE [PictureID] = @PictureID">
但结果还是不能保存,而且如果编辑过主键字段的值后,点完“update”后所有字段的修改都没有更新
回头想想也对,在更新的命令中set段中的主键参数@PictureID和where段中的是同一个参数,传递给数据库的值应该也是一样的
而且可以判断都是编辑后的值,要不然其他的字段就可以更新了
要实现更新主键的效果必须把where段的参数设置成接受旧值的参数

上网百度找到了微软的关于“数据源控件如何为数据绑定字段创建参数”的文章
拜读完迷迷糊糊有了些感觉
将数据源控件的OldValuesParameterFormatString属性改成old_{0},CompareAllValues属性改成OverwriteChanges
修改命令改成了
UpdateCommand="UPDATE [Gallery] SET [PictureID] = @PictureID, [FixtureID] = @FixtureID, [UploadedByMemberName] = @UploadedByMemberName, [Notes] = @Notes, [PictureURL] = @PictureURL WHERE [PictureID] = @old_PictureID">
成功实现了修改主键的效果

再次拜读微软的解释,想让自己头脑里的这团浆糊清晰点
大概理解是这样的
数据绑定控件会在数据操作时通过values,keys,newvalues,oldvalues这四个集合向数据源控件传送参数值,不是每次操作四个参数都传送
values插入时传送
keys是更新或删除时传送参数的,keys传送的是在数据绑定控件中DataKeyNames指定的字段,并不一定是表中的主键字段,而且还会将这些字段的旧值和新值一起传给数据源控件
newvalues是为更新传递新值
oldvalues是为更新和删除传递旧值,它传递的字段不包括keys中已有的字段

传送过去后,数据源控件会自动的接受对于新值,直接会将值填充同名的参数,旧值需要设置OldValuesParameterFormatString属性,然后在命令中使用带对应前缀的参数,就像我上面修改后的更新命令

默认情况下oldvalues是不被接受的,只有当数据源控件的ConflictDetection属性设成CompareAllValues才会接受

理解完微软的文章,我做了一下删除记录的试验,我特意找了一个没有设置主键的表
先是按照向导设置实现删除,在配置数据源向导的“配置选择语句”那一步,高级按钮点开是不给勾选增加、删除、更新的功能的,这样,数据绑定控件的删除功能也就不能被打开了
于是自己模仿着在数据源控件代码里写了删除的语句
DeleteCommand="DELETE FROM [News] where [NewsID]=@NewsID"
再看数据绑定控件,已经可以选择删除功能了,测试看有没有效果,报错“Must declare the scalar variable "@NewsID".
再看微软的葵花宝典,删除时,数据绑定控件传递keys和oldvalues两个集合,而要用keys接受,必须在数据绑定控件中把NewsID添加到DataKeyNames属性中,试试,报同样的错误,忘记设置OldValuesParameterFormatString了,还要把@NewsID改成带前缀的参数,再改,再试,成功。
再试一下不用keys,也就是用oldvalues,删除DataKeyNames属性,不行,报错,将ConflictDetection设置改成CompareAllValues,成功,再次验证了必须设置ConflictDetection为CompareAllValues,才可以接受oldvalues

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值