1

当 ID 列为主键并设置为自动增量时,如何执行表插入命令?

我尝试了以下方法:

      using (SqlConnection conn = new SqlConnection(connstring))
        {
            SqlCommand identChange = conn.CreateCommand();
            identChange.CommandText = "SET IDENTITY_INSERT table1 ON";
            conn.Open();
            string commtext = @"Insert INTO table1 (ID, Username)
                       SELECT @ID, @User";
            SqlCommand comm = new SqlCommand(commtext, conn);
            comm.Parameters.AddWithValue("@ID", -1);
            comm.Parameters.AddWithValue("@User", loggedinuser);
            identChange.ExecuteNonQuery();
            comm.ExecuteNonQuery();
            conn.Close();
        }

但无论将什么值放入 ID(我尝试过 0 和 -1),它都会在 ID 列下创建一个具有该值的新行。结果,当我尝试插入下一行时,它给了我一个错误,因为现在我有两行具有相同的 ID。

4

3 回答 3

5

如果它是自动增量列,您就不必提及该列。

string commtext = @"Insert INTO table1 (Username) SELECT @User";
SqlCommand comm = new SqlCommand(commtext, conn);
comm.Parameters.AddWithValue("@User", loggedinuser);
于 2012-09-13T16:26:53.903 回答
1

你这样说:

int addUser( string userName )
{
  if ( string.IsNullOrWhiteSpace(userName) throw new ArgumentException("invalid user name" , "userName") ;
  int user_id ;
  string connectString = GetSomeConnectString() ;

  using ( SqlConnection connection = new SqlConnection( connectString ) )
  using ( SqlCommand    cmd        = connection.CreateCommand() )
  {

    cmd.CommandType = CommandType.Text ;
    cmd.CommandText = @"
insert dbo.user ( user_name ) values ( @user_Name )
select user_id = @@SCOPE_IDENTITY
" ;

    cmd.Parameters.AddWithValue( "@user_name" , userName ) ;

    connection.Open() ;
    user_id = (int) cmd.ExecuteScalar() ;
    connection.Close() ;
  }

  return user_id ;
}

identity不能在插入时指定任何具有属性(或自动递增列)的列。您必须指定要提供其值的列。任何未提供的列都必须可以为空、具有默认约束或者是自动递增列。

于 2012-09-13T16:37:55.303 回答
0

除非您想显式设置 ID,否则不要将 IDENTITY_INSERT 设置为 ON,否则使用自动递增的值。

 using (SqlConnection conn = new SqlConnection(connstring))
    {           
        conn.Open();
        string commtext = @"Insert INTO table1 (Username)
                   SELECT @User";
        SqlCommand comm = new SqlCommand(commtext, conn);
        comm.Parameters.AddWithValue("@User", loggedinuser);
        identChange.ExecuteNonQuery();
        comm.ExecuteNonQuery();
        conn.Close();
    }
于 2012-09-13T16:27:47.163 回答