奇怪了 ,以前做项目开发,执行insert into 插入语句,插入成功,返回受影响的行数就不会是-1,可现在用同样的语句,返回受影响的行数却为-1了我们开发团队的也有人遇到这问题!
//int hs = cmd.ExecuteNonQuery(); 这样获得的受影响的行数为-1!!!
我还用返回刚刚插入数据返回的id show出来, 没有问题,数据库数据正常。
代码: cmd1 = " exec CheLiang_CheDui_Che_ChaRuCheXinXi'" + cddm + "','" + cph + "','" + ztdm + "','" + zzgg + "','" + cx + "','" + zzhy + "','" + kchy+ "','" + fdjh + "','" + cjh + "','" + dph + "','" + bz + "','" + lrrdm + "'";
con.Open();
cmd.CommandText = cmd1;
//SqlCommand cmd = new SqlCommand(cmd1,con);
cmd.Connection = con;
//int hs = cmd.ExecuteNonQuery(); //当用这语句的时候执行成功,但返回的还是-1哦
int id= Convert.ToInt32(cmd.ExecuteScalar());//当用这语句的时候一样可以执行成功,返回的id也是对的呢
//MessageBox.Show(hs.ToString());
if (hs > 0)//像这里用行数判断就不行了!用返回的id没有问题
{
}
else { MessageBox.Show("数据库异常!", "系统提示"); }//提示失败
con.Close(); 网上找了下,说现在用返回受影响的行数判断是不行了为啥了呢?
//int hs = cmd.ExecuteNonQuery(); 这样获得的受影响的行数为-1!!!
我还用返回刚刚插入数据返回的id show出来, 没有问题,数据库数据正常。
代码: cmd1 = " exec CheLiang_CheDui_Che_ChaRuCheXinXi'" + cddm + "','" + cph + "','" + ztdm + "','" + zzgg + "','" + cx + "','" + zzhy + "','" + kchy+ "','" + fdjh + "','" + cjh + "','" + dph + "','" + bz + "','" + lrrdm + "'";
con.Open();
cmd.CommandText = cmd1;
//SqlCommand cmd = new SqlCommand(cmd1,con);
cmd.Connection = con;
//int hs = cmd.ExecuteNonQuery(); //当用这语句的时候执行成功,但返回的还是-1哦
int id= Convert.ToInt32(cmd.ExecuteScalar());//当用这语句的时候一样可以执行成功,返回的id也是对的呢
//MessageBox.Show(hs.ToString());
if (hs > 0)//像这里用行数判断就不行了!用返回的id没有问题
{
}
else { MessageBox.Show("数据库异常!", "系统提示"); }//提示失败
con.Close(); 网上找了下,说现在用返回受影响的行数判断是不行了为啥了呢?
解决方案 »
- 请问Dictionary字典在声明的时候如何赋值
- c#中如何获取可编辑的下拉列表所编辑的值
- VS2005能否增量编译?
- C#Type类字段问题 急 急 急 !!!分不多 但请帮帮忙
- 在整个程序运行期间都要执行的代码写在何处?
- 用户代码未处理 System.Data.SqlClient.SqlException
- 一个调用存储过程的问题,很不解,在线等!!!
- C#如何解决以下网络通信的问题100分
- 高手说下这段代码的意思?
- 如何用这样的输出格式把数据输入到一个txt文件?谢谢!
- c# winform 如何用子窗体整体刷新父窗体?
- 使用了system.timers.timer以后,如何让timer暂停?
ExeuteNoQuery()只对Update,Insert,Delete语句是返回修改行数的
对于 UPDATE、INSERT 和 DELETE SQL 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1
一定不要使用 SET NOCOUNT ON
{
SqlCommand cmd = new SqlCommand("p_Add", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Name", Name); conn.Open();
cmd.ExecuteNonQuery();}
下面执行看下是什么结果
cmd.ExecuteNonQuery();这值就是-1了。
int id= Convert.ToInt32(cmd.ExecuteScalar());
获取返回的id没有错。
执行的结果是对的,但我获取返回受影响的行数就出问题了,-1啊
呵呵,这是其中一种调用方法啊,另外一种我注释了的
//SqlCommand cmd = new SqlCommand(cmd1,con);
都试过了,返回的还是-1说回来,按你的说,我暑假开发的教务系统软件,学校现在用着呢,一样的方法一样的代码,返回的就不是-1啊。我这种调用是没有问题的
我以前也遇到过。
这个ExecuteScalar方法是返回第一行,第一列的数据. 你只是插入语句, 当然没有值, cmd.ExecuteNonQuery(); 这个返回影响行!
呵呵,我这是用了两种方法测试啊。你没有看清我的问题——我是说用了cmd.ExecuteNonQuery();返回的都是 -1!!!!
(*^__^*) 嘻嘻
SET NOCOUNT ON
?? 不懂什么意思。
return @@ROWCOUNT在回调的时 用 int row = Convert.ToInt32(cmd.ExecuteScalar())即可
我们来做一个分析:只有UPDATE INSERT Delete 最后一条 语句 cmd.ExeuteNoQuery()返回的是受影响的行,默认值是-1,只有语句执行成功,才会返回受影响的行,这里隐藏了一个事务提交事件。而你写的那个所谓的插入语句,其实只是一存储过程,执行这个存储过程,在数据里有一个 @@ROWCOUNT变量,发生了变了,而你却没有返回来。用ExecuteNoQuery()这种提交数据库,只有-1的值,因为你用的不是Insert 语句。
我来打个比方,我们写有一个有返回的值的函数 其中有很多的语句
private int GetValue()
{
int ret=-1;
---
return ret;
}---这些语句都没有改变 ret 的值,你想想,他会返回什么值。楼猪,不知我说明白没有。。也不知你看得懂不。