2015-03-03 3 views
0
  • У меня есть DataGridView с 4-мя столбцами: UserID, FirstName, LastName, Emailоператор Update изменяет неправильные записи

  • Когда я дважды щелкните строку, другая форма всплывает 4 текстовых полей со значениями в строке и внутри тех, каждое текстовое поле с значение ячейки

  • Когда я нажимаю кнопку отправки, эта строка обновляется значениями текстового поля.

  • У меня есть работа с ....where UserID = @UserID. Но если ячейка столбца меняет IS UserId, изменяется неправильная строка или никакая строка.

Вопрос

Как я могу изменить строку для любого значения столбца и он изменяет правый ряд без столбца инкрементора?

Код

public partial class EditUser : Form 
{ 
    public DataGridViewRow dgvRow; 
    public EditUser() 
    { 
     InitializeComponent(); 
    } 

    private void EditUser_Load(object sender, EventArgs e) 
    { 
     lbl5.Text = dgvRow.Cells[0].Value.ToString(); 
     txtUserID.Text = dgvRow.Cells[0].Value.ToString(); 
     txtFName.Text = dgvRow.Cells[1].Value.ToString(); 
     txtLName.Text = dgvRow.Cells[2].Value.ToString(); 
     txtEmail.Text = dgvRow.Cells[3].Value.ToString(); 
     label1.Visible = false; 
     txtUserID.Visible = false; 
    } 

    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
    { 
     this.Visible = false; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     SqlConnection sc = new SqlConnection(); 
     SqlCommand com = new SqlCommand(); 
     sc.ConnectionString = (""); 
     sc.Open(); 
     com.Connection = sc; 
     com.CommandText = ("update JoshUserTable SET UserID = @UserID, [email protected],[email protected],[email protected] where UserID = @UserID"); 
     com.Parameters.AddWithValue("@UserID", txtUserID.Text); 
     com.Parameters.AddWithValue("@FirstName", txtFName.Text); 
     com.Parameters.AddWithValue("@LastName", txtLName.Text); 
     com.Parameters.AddWithValue("@Email", txtEmail.Text); 
     com.ExecuteNonQuery(); 
     sc.Close(); 
    } 

    private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
    { 
     label1.Visible = true; 
     txtUserID.Visible = true; 
     SqlConnection sc = new SqlConnection(); 
     SqlCommand con = new SqlCommand(); 
     sc.ConnectionString = (""); 
     sc.Open(); 
     con.Connection = sc; 
     con.CommandText = ("update JoshUserTable SET UserID = @UserID, [email protected],[email protected],[email protected] where FirstName = @FirstName"); 
     con.Parameters.AddWithValue("@UserID", txtUserID.Text); 
     con.Parameters.AddWithValue("@FirstName", txtFName.Text); 
     con.Parameters.AddWithValue("@LastName", txtLName.Text); 
     con.Parameters.AddWithValue("@Email", txtEmail.Text); 
     con.ExecuteNonQuery(); 
     sc.Close(); 
    } 
} 

ответ

0

Я думаю, что вы работаете в более серьезной проблемой вообще. Что делать, если запись изменяется другим пользователем одновременно. Вы столкнетесь с проблемой параллелизма . Вот почему автоматически сгенерированный код CommandBuilder всегда проверяет старые значения.

Для вашего текущего кода я добавил чек для исходного идентификатора пользователя.

private void button1_Click(object sender, EventArgs e) 
{ 
    SqlConnection sc = new SqlConnection(); 
    SqlCommand com = new SqlCommand(); 
    sc.ConnectionString = ("My Connection String"); 
    sc.Open(); 
    com.Connection = sc; 

    /// check for original value in whereClause 
    com.CommandText = ("update JoshUserTable SET UserID = @NEW_UserID, 
         [email protected],[email protected],[email protected] 
         where UserID = @ORIGINAL_UserID"); 


    com.Parameters.AddWithValue("@NEW_UserID", txtUserID.Text); 
    com.Parameters.AddWithValue("@ORIGINAL_UserID", INSERT_ORIGINAL_USERID); 


    com.Parameters.AddWithValue("@FirstName", txtFName.Text); 
    com.Parameters.AddWithValue("@LastName", txtLName.Text); 
    com.Parameters.AddWithValue("@Email", txtEmail.Text); 
    com.ExecuteNonQuery(); 
    sc.Close(); 
} 

Проблема параллелизм до сих пор остается нерешенной ....

+0

Спасибо за вход, я пошел немного другой маршрут. Наряду с полем userIDtext я сделал ярлык, который показывает идентификатор пользователя. Когда появляется форма редактирования, пользовательский текст не невидим. Рядом с меткой UserID у меня есть ссылка «change», которая при щелчке делает текстовое поле UserID видимым с целью изменения имени. Если ссылка не отмечена, не нужно менять имя. В моем событии linkcheck я изменил предложение where, чтобы совместить имя и фамилию, так как вероятность того, что их имя не изменится, даже если может быть ID пользователя или электронной почты. Однако строка не меняется. См. Выше –

+0

Вау, Мне понадобилось секунду, чтобы понять, что не имеет смысла. Я делал свою ссылку, чтобы сделать больше, чем предполагалось. –

+0

ok получил вас - во всяком случае, я действительно думаю, что вы должны ** проверить исходное значение (ы) и установить (a) новое значение **. При вызове 'executeNonQuery()' вы получите количество обновленных записей. Если эта запись * не равна 1 *, то что-то пошло ужасно неправильно! –

Смежные вопросы