注册 登录
编程论坛 VB.NET论坛

超级超级郁闷的ExecuteNonQuery返回值,请高人解决!

binghe6610 发布于 2010-10-02 01:21, 2667 次点击
今天超级超级的郁闷,非常简单的一个ExecuteNonQuery语句,为什么返回值总是不正确!!!
  Dim cn As New SqlConnection(cnchuan)
     
        If cn.State = ConnectionState.Closed Then
            cn.Open()
        End If
        Dim cmd As SqlCommand = cn.CreateCommand
         = "update kdb set kd_zuofei=1 where kd_xsdh='1001'"
        cmd.ExecuteNonQuery
        cn.Close()

1001是主键,唯一值,把语句放在查询分析器里执行结果返回值为1,是正确的
可是,放在里面返回值却是2
此时我的表中只有一条记录,如果表中有2条记录就返回3,如果有3条记录就返回4
我真郁闷死了,在中的返回值为什么总是表中行数+1呢?!!!!
请高人解决
22 回复
#2
binghe66102010-10-02 01:23
中我需要这个正确的返回值进行判断的。请不要告诉我换别的方法
#3
cnfarer2010-10-02 07:48
你在乎这个返回值吗?只要不是0就行了!
#4
binghe66102010-10-02 08:26
谢谢回复,但是问题是,如果在查询分析器里返回是0的时候,在中返回值都是大于0的,
#5
binghe66102010-10-02 08:28
也就是说,中返回值没有0,有时候返回是1有时候返回一个很莫名其妙的数字(肯定是大于0的),我仔细观察了一下,好像和表中的行数有一定的关系
#6
binghe66102010-10-02 08:30
郁闷了我一天了!还是没有找到原因

kd_zuofei字段在数据库中是bit类型
#7
binghe66102010-10-02 08:32
其实,我就是判断更新语句更新数据是否成功就可以了,
但是目前是中的返回值就没有0的时候
#8
binghe66102010-10-02 08:36
说明一下,可以执行成功,就是中显示的返回值和查询分析器里显示的返回值不一样,而且也没有什么规律性
#9
binghe66102010-10-02 09:14
现在真是奇怪之极啊,我用一个布尔值来读修改的结果,无论数据的bit是0还是1,读到的都是false
#10
binghe66102010-10-02 09:15
我的数据库是SQL SERVER2000 SP4
#11
不说也罢2010-10-02 10:34
我的数据库 也是SQL SERVER2000 SP4
为了测试楼主的问题,我新建了一个表,并设置了两个字段kd_zuofei(bit)   kd_xsdh(nvarchar)
经测试,未出现楼主所说的返回值不准确的情况。
下面是刚测试的代码

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim connStr As String = "SERVER=.;UID=sa;PWD=;DATABASE=ceshi"
        Dim conn As SqlClient.SqlConnection = New SqlClient.SqlConnection(connStr)
        Dim cmd As SqlCommand = conn.CreateCommand
        Dim sql As String = "update [admin] set [kd_zuofei]=0 where [kd_xsdh]='user'"
        conn.Open()
         = sql
        MsgBox(cmd.ExecuteNonQuery)
        conn.Close()

    End Sub
#12
binghe66102010-10-02 13:32
谢谢回复,最后我还是改用别的方法了,因为数据库更新是成功的,所以,我在更新完后,直接在中查询bit的值是true 还是flase
我别的表中也有bit类型的字段,也有更新,返回值都准确。
这个郁闷的表啊
#13
binghe66102010-10-02 13:33
为了感谢两位的回复,给分
#14
binghe66102010-10-09 10:34
奇怪的ExecuteNonQuery返回值,我今天测试项目中其他更新语句返回值都是8,无论是是否更新都返回8,真是奇怪了
#15
binghe66102010-10-09 10:35
更新SQL语句的WHERE是主键ID,不应该有问题吧,怎么在中的返回值显示都是一个没有规律的不准确数呢?
#16
binghe66102010-10-09 11:00
找到一个唯一的不同就是,我所更新的表中有一个触发器,触发器也是用来更新别的表的,难道返回值也包括了触发器?
#17
binghe66102010-10-09 11:02
经过检查返回的不规律值包括了,触发器更新的记录。郁闷了,这样如何来区分我在项目中的更新返回值呢?
#18
binghe66102010-10-09 11:11
看来也有人遇到了此类问题,http://doc.
但是也没有很好解决办法
#19
binghe66102010-10-09 11:19
我看这个问题应该跟微软反映一下
#20
binghe66102010-10-09 11:23

因为在中用更新的返回值=返回值+触发器更新表的返回值
我看目前唯一的笨办法就是:返回值-触发器更新表的返回值=想要的更新语句返回值
#21
不说也罢2010-10-09 11:49
以下是引用binghe6610在2010-10-9 11:00:27的发言:

找到一个唯一的不同就是,我所更新的表中有一个触发器,触发器也是用来更新别的表的,难道返回值也包括了触发器?
ExecuteNonQuery方法对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。如果正在执行插入或更新操作的表上存在触发器,则返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。对于其他所有类型的语句(如SELECT),返回值为 -1。如果发生回滚,则返回值也是 -1。
#22
binghe66102010-10-09 13:46
看来是个难题
#23
不说也罢2010-10-09 18:19
以下是引用binghe6610在2010-10-9 13:46:11的发言:

看来是个难题
并不是个难题啊。如果楼主必须使用触发器的话,而且又必须要返回UPDATE,INSERT,DELETE后影响的行数,可以使用SQLSERVER存储过程啊,在调用存储过程时,利用其返回值来判断执行UPDATE,INSERT,DELETE语句后所影响到的行数就可以了。
1