奇怪了 ,以前做项目开发,执行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();         网上找了下,说现在用返回受影响的行数判断是不行了为啥了呢?

解决方案 »

  1.   

    添加参数,调用存储过程
    ExeuteNoQuery()只对Update,Insert,Delete语句是返回修改行数的 
    对于 UPDATE、INSERT 和 DELETE  SQL 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1 
    一定不要使用 SET NOCOUNT ON 
      

  2.   

    using(SqlConnection conn = new SqlConnection(""))
    {
             SqlCommand cmd = new SqlCommand("p_Add", conn);
             cmd.CommandType = CommandType.StoredProcedure;
             cmd.Parameters.AddWithValue("@Name", Name);         conn.Open();
             cmd.ExecuteNonQuery();}
            
      

  3.   

    你在sql
    下面执行看下是什么结果
      

  4.   

    这样写其实也一样
     cmd.ExecuteNonQuery();这值就是-1了。
      

  5.   


    int id= Convert.ToInt32(cmd.ExecuteScalar());
    获取返回的id没有错。
    执行的结果是对的,但我获取返回受影响的行数就出问题了,-1啊
      

  6.   

    C#中调用存储过程不是那样调用的,你只需要给个存储过程名,然后提供参数。否则视为一般SQL语句,所以你看不到影响行数。
      

  7.   

    打开Sql管理器,选择服务器属性(服务器上点右键出来个包含属性的菜单),在右侧选择连接,左侧有个列表,看看里面的no count是不是被选中了?
      

  8.   


    呵呵,这是其中一种调用方法啊,另外一种我注释了的
    //SqlCommand cmd = new SqlCommand(cmd1,con);
    都试过了,返回的还是-1说回来,按你的说,我暑假开发的教务系统软件,学校现在用着呢,一样的方法一样的代码,返回的就不是-1啊。我这种调用是没有问题的
      

  9.   

    在插入的存储过程结尾处应该加入:return @@rowcount 吧。。
    我以前也遇到过。
      

  10.   

    你是不是使用了SQL中的关键字啊,使用了关键字之后,虽然插入成功,但是却显示失败。你把字段用[]括起来试试。
      

  11.   

    是不是写方法的时候,在return的时候加了"-"号啊.
      

  12.   

     int id= Convert.ToInt32(cmd.ExecuteScalar());//
    这个ExecuteScalar方法是返回第一行,第一列的数据. 你只是插入语句, 当然没有值, cmd.ExecuteNonQuery(); 这个返回影响行!
      

  13.   

       int id= cmd.ExecuteNonQuery(); 
      

  14.   

    注意参数赋值时候,和sql语句时候的一致性...
      

  15.   


    呵呵,我这是用了两种方法测试啊。你没有看清我的问题——我是说用了cmd.ExecuteNonQuery();返回的都是 -1!!!!
    (*^__^*) 嘻嘻
      

  16.   

    我看到了一颗闪耀的钻石Oh~~~My God~~~~~~~~~~~~`
      

  17.   

    你这个根本不对,存储过程可以是很复杂的事物,比如表1加5列然后表2加10列,那你说返回5还是返回10啊?你把存储过程和insert搞混了。
      

  18.   


    SET NOCOUNT ON
    ?? 不懂什么意思。
      

  19.   

    楼猪:你还真行,你现在执行是存储过程,而不是 插入语句,你要得得到返回行,必须在存储过程中加入
    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 的值,你想想,他会返回什么值。楼猪,不知我说明白没有。。也不知你看得懂不。
      

  20.   

    怎么知道一条Select语句从表中选出了多少行啊???
      

  21.   

    接收table。然后table.Rows.count 
      

  22.   

    没有解决问题 count(1) 都有数据 为什么还是返回 -1呢?