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 を持つ行が 2 つあるため、エラーが発生します。

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(または自動インクリメント列) を挿入で指定することはできません。値を提供する列を指定する必要があります。指定されていない列は、NULL 可能であるか、デフォルトの制約があるか、自動インクリメント列である必要があります。

于 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 に答える