关于ADO.Net使用TableAdapter时产生:更新要求有效的deletecommand或update,insert,selectcommand的解决办法,以及“违反并发性”处理

这几天在做一个关于SQL server数据库的小型管理系统,在用VB2005时出现了一点小问题

这并不是我第一次涉及VB2005关于ADO.NET的东西,但还是有些新的发现,以前进行数据库操作并没有用到工具栏里的控件,这次由于时间紧,而且delphi 7里专门有关于ADO的控件组,连接数据库很方便,所以我想VB里应该也有相似的功能吧。无意间在网上看到一篇文章,方法真的非常简单,只要把数据源添加好,然后把要进行操作的数据表的DataGridView拖放到Form中就可以了,会自动生成一个BindingSource,一个Dataset,一个BindingNavigator和一个TableAdapter。运行项目时,利用BindingNavigator添加数据并没有问题,但是删除条目和修改单元格内容后,点保存按钮会弹出“更新要求有效的deletecommand”或“更新要求有效的updatecommand”,编译器把错误定义在了保存按钮的click事件中的me.xxxTableAdapter.update(xxxDataset.xxxtable)命令上,其实引起这个错误的原因很简单,xxxTableAdapter.update的作用是更新你数据库中的表,如果你当前Dataset中的表有多出来的行,则会执行xxxTableAdapter里的InsertCommand,以此类推,如果你在DataSet中删除了数据,在xxxTableAdapter.update执行时,就必须调用DeleteCommand命令,修改了数据就要执行updateCommand命令,但是有时你在拖拽完,生成TableAdapter的时候,不自动生成TableAdapter的这些命令,所以你要手动配置。如图1

在数据集设计器中点击要修改的TableAdapter,然后在属性中找到对应的command,如果这个TableAdapter在运行的时候出现“更新要求有效的deletecommand”,对应的属性里deletecommand会显示“(无)”,你需要新建一个deletecommand然后用SQL语言填写deletecommand的commandtext,在填写commandtext时会弹出一个“查询生成器”对话框,下面的空白处可以填写类似这样的SQL语句

“DELETE FROM Region
WHERE     (RegionID = @Original_RegionID) AND (RegionDescription = @Original_RegionDescription)”

然后点确定即可,你会在上图的deletecommand的parameters中看到,自动增加了@Original_RegionID和 @Original_RegionDescription两个变量,他们的属性也已经根据表的情况自动生成,其中,他们的SourceVersion属性为Original,这样我们的工作就完成了,TableAdapter的deletecommand添加成功,如果要添加updatecommand,SQL语句要写成这样

“UPDATE    Region
SET              RegionID = @RegionID, RegionDescription = @RegionDescription
WHERE     (RegionID = @Original_RegionID) AND (RegionDescription = @Original_RegionDescription)”

updatecommand的parameters会有4个@RegionID, @RegionDescription,@Original_RegionID,@Original_RegionDescription,其中@RegionID, @RegionDescription的SourceVersion为Current,另外两个为Original,我想其中的意思大家应该能领悟吧!

如果设置正确的话,就不会出现缺少command的错误了,但是有时还会出现并发性冲突的问题,弹出“违反并发性: DeleteCommand 影响了预期 1 条记录中的 0 条”这样的对话框。在网上看了好多文章,但是都看得不是很明白,没有针对我这种具体情况的,我个人感觉这是.net的一种保护措施,避免程序产生并发性的错误,这里我不讲什么是并发性,我只提出一个解决问题的方法,也许会不适合各位的问题,但不妨做一个尝试。

例如我现在有一个表T_CZ  各列为{F_ID,F_CZ,F_Remark}

在DELETEcommand里写如下语句“ DELETE FROM  T_CZ  WHERE (F_ID=@Original_F_ID) AND (F_CZ=@OriginalF_CZ) AND (F_Remark=@Original_F_Remark)  ”

这时在删除一条数据后执行xxxTableAdapter.update时会产生上面所说的情况,但是如果写成“ DELETE FROM  T_CZ  WHERE (F_ID=@Original_F_ID)”就不会产生了,写成“DELETE FROM  T_CZ  WHERE F_Remark=@Original_F_Remark ”也不会出现问题,也许这样就可以避免并发性冲突了吧,但是要注意,最好还是在WHERE语句后面写主键或者能代表其唯一性的列来作为删除条件。UpdateCommand亦然。

本文纯属一己之见,如果有不同意见可以一起探讨。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页