日期:2014-05-17  浏览次数:20675 次

ExecuteNonQuery新手求教
如果我执行的是一个删除语句,比如我要删除某条新闻,那么用ExecuteNonQuery()不会出错。
但是如果我在建立数据库表的时候,我也建立了一个触发器,当删除新闻后,会连同新闻的评论一块删除。
评论表跟新闻表不是同一张表,这样用ExecuteNonQuery()返回的是两个数字么。
------最佳解决方案--------------------
ExecuteNonQuery的返回值可以无视,其意义几乎没有,要判断是否执行成功,只要捕获异常即可,如果无异常发生,则必定执行成功,至于是否存在数据给你删除,那个不是通过删除后返回影响行数来判断的,而是通过删除前查询下该数据是否存在来判断,必须搞清逻辑的先后。
------其他解决方案--------------------
1、返回值已经告诉你返回一个int,不是一个int[]
2你的情况应该使用级联删除,还不是触发器

引用:
ExecuteNonQuery的返回值可以无视,其意义几乎没有,要判断是否执行成功,只要捕获异常即可,如果无异常发生,则必定执行成功,至于是否存在数据给你删除,那个不是通过删除后返回影响行数来判断的,而是通过删除前查询下该数据是否存在来判断,必须搞清逻辑的先后。


这个看法是不正确的。如
delete from [dbo].[OrderDetail] where id=-1000000

设id是int自增列,在sqlserver中默认值情况下id永远是大于0的值。
上述代码不可能抛出异常。。
但是影响的行数就是0.你不能认为它是出现错误了。

如果id是能过从url中进行get传递的话,你无法控制别人修改这个值,虽然你可以做int的判断。

例:
delete from [dbo].[OrderDetail] where id=1
在多个用户并发操作的情况下,id=1的记录可能已经正好刚刚被删除了,这时也不会抛出异常。
返回0可以正常的告之用户,记录不存在或已经被删除。


------其他解决方案--------------------
您可以使用 ExecuteNonQuery 来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行 UPDATE、INSERT 或 DELETE 语句,在不使用 DataSet 的情况下更改数据库中的数据。

虽然 ExecuteNonQuery 不返回任何行,但映射到参数的任何输出参数或返回值都会用数据进行填充。

对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。如果正在执行插入或更新操作的表上存在触发器,则返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1。
------其他解决方案--------------------
还有,如果我用int b来接收ExecuteNonQuery()返回的数字的时候出错了,我应该怎么办~~因为ExecuteNonQuery()返回的是两个数字,b=cmd.ExecuteNonQuery()就出错~
------其他解决方案--------------------
就是说在有触发器的情况下,返回的可能是多个数字??那我怎么判断~int b只是一个数字。

------其他解决方案--------------------
回复 #3:你这么说我倒是觉得可以找到解决的办法,我去试试
------其他解决方案--------------------
引用:
1、返回值已经告诉你返回一个int,不是一个int[]
2你的情况应该使用级联删除,还不是触发器

引用:ExecuteNonQuery的返回值可以无视,其意义几乎没有,要判断是否执行成功,只要捕获异常即可,如果无异常发生,则必定执行成功,至于是否存在数据给你删除,那个不是通过删除后返回影响行数来判断的,而是通过删除前查询下该数据是否存……

额,好吧,如果返回的知识一个int,那就是我代码有错了。
------其他解决方案--------------------
引用:
1、返回值已经告诉你返回一个int,不是一个int[]
2你的情况应该使用级联删除,还不是触发器

引用:ExecuteNonQuery的返回值可以无视,其意义几乎没有,要判断是否执行成功,只要捕获异常即可,如果无异常发生,则必定执行成功,至于是否存在数据给你删除,那个不是通过删除后返回影响行数来判断的,而是通过删除前查询下该数据是否存……

如果说你连最基本的低级错误都会犯,那就别写SQL了,那样即使发现问题了也无法解决。
你举例的低级错误对于一个数据库略懂的人来说都不可能会犯,菜鸟要是犯错,那不可能通过那个ExecuteNonQuery的返回值来找出问题的关键,所以说它没意义一点没错。至于删除传入的条件本身是否有效,这个是提前判断而不是事后判断,你仔细看过我的回复了没?要先查询下看该条记录是否存在,如果不存在给出友善的错误提示,根本不可能会出现异常情况。
至于并发,对于这种直接删除的简单操作,不可能出现撞车的,任何极端情况都不会发生这种小规模的撞车,如果执行时间较长,有1秒以上的时间,那么就要考虑用事务保证数据的完整性,当然,这种删除操作本事无所谓撞车,多一次删除不会带来任何副作用。
------其他解决方案--------------------
引用:
引用:1、返回值已经告诉你返回一个int,不是一个int[]
2你的情况应该使用级联删除,还不是触发器

引用:ExecuteNonQuery的返回值可以无视,其意义几乎没有,要判断是否执行成功,只要捕获异常即可,如果无异常发生,则必定执行成功,至于是否存在数据给你删除,那个不是通过删除后返回影响行……

算了,我来问个问题,你们倒争论起来了~~我自己折腾去
------其他解决方案--------------------
ExecuteNonQuery()的返回值不是用来判断操作成功与否的,主要对于更新和删除操作有一定意义:你可以知道更新(或删除)了几条记录。
根据楼主的需求,可以采用主外键级联删除,或者事务操作。
------其他解决方案--------------------