//代码片段大致如下:Insert Into T_Users(UserName,UserPassword,ErrorTimes) output inserted.ID values(@userName, @userPassword, @errorTimes);                                   //使用output inserted.ID是为了得到插入后最后一条记录的ID值cmd.Parameters.Add(new SqlParameter("userName", userName));
cmd.Parameters.Add(new SqlParameter("userPassword", userPassword));
cmd.Parameters.Add(new SqlParameter("errorTimes", errorTimes));                        
cmd.ExecuteNonQuery();
                        
int id = Convert.ToInt32(cmd.ExecuteScalar());  //保存最后一条记录的ID,为什么每次执行完这条语句后,每一条记录都被插入了两次?

解决方案 »

  1.   

    cmd.ExecuteNonQuery();
    cmd.ExecuteScalar();
      

  2.   

    cmd.ExecuteNonQuery();//执行了一次
                            
    int id = Convert.ToInt32(cmd.ExecuteScalar()); 、、 又一次
      

  3.   

    cmd.ExecuteNonQuery();
    cmd.ExecuteScalar();
      

  4.   


    Sql语句:
    Insert Into T_Users(UserName,UserPassword,ErrorTimes) output inserted.ID values(@userName, @userPassword, @errorTimes);                                   //使用output inserted.ID是为了得到插入后最后一条记录的ID值
    select @@IDENTITY;C# 命令
    cmd.Parameters.Add(new SqlParameter("userName", userName));
    cmd.Parameters.Add(new SqlParameter("userPassword", userPassword));
    cmd.Parameters.Add(new SqlParameter("errorTimes", errorTimes));                        int id = Convert.ToInt32(cmd.ExecuteScalar());  //保存最后一条记录的ID,为什么每次执行完这条语句后,每一条记录都被插入了两次?
      

  5.   

    根据实际情况获取刚刚插入的那条记录ID 也是很有讲究的。IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
    @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
    SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。
      

  6.   

    感谢LS解决了SqlCommand.ExecuteScalar 方法:执行查询,并返回查询所返回的结果集中第一行的第一列。 忽略其他列或行。
    SqlCommand.ExecuteNonQuery 方法:对连接执行 Transact-SQL 语句并返回受影响的行数。这两个方法都会执行查询,区别在于返回受影响的行数不同,这样我的插入语句就被执行了两次查询.