当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。
答案 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();
}