使用autoincrement主键在c#中的sql表中插入一行

时间:2012-09-13 16:24:19

标签: c# sql-server

当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。

3 个答案:

答案 0 :(得分:5)

如果是自动增量色谱柱,您就不必提及色谱柱。

string commtext = @"Insert INTO table1 (Username) SELECT @User";
SqlCommand comm = new SqlCommand(commtext, conn);
comm.Parameters.AddWithValue("@User", loggedinuser);

答案 1 :(得分: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属性(或自动增量列)的列。您必须指定要提供其值的列。任何未提供的列都必须是可空的,具有默认约束或者是自动递增列。

答案 2 :(得分:0)

除非您想明确设置ID,否则不要设置IDENTITY_INSERT,否则请使用自动递增的值。

 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();
    }