2012-08-23 10 views
15

Veritabanım için basit bir silme düğmesi uygulamak istiyorum. etkinliği yöntemi şöyle görünür:SqlCommand parametresi her yineleme ile nasıl tekrar kullanılır?

private void btnDeleteUser_Click(object sender, EventArgs e) 
{ 
    if (MessageBox.Show("Are you sure?", "delete users",MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK) 
    { 
     command = new SqlCommand(); 
     try 
     { 
      User.connection.Open(); 
      command.Connection = User.connection; 
      command.CommandText = "DELETE FROM tbl_Users WHERE userID = @id"; 
      int flag; 
      foreach (DataGridViewRow row in dgvUsers.SelectedRows) 
      { 
       int selectedIndex = row.Index; 
       int rowUserID = int.Parse(dgvUsers[0,selectedIndex].Value.ToString()); 

       command.Parameters.AddWithValue("@id", rowUserID); 
       flag = command.ExecuteNonQuery(); 
       if (flag == 1) { MessageBox.Show("Success!"); } 

       dgvUsers.Rows.Remove(row); 
      } 
     } 
     catch (SqlException ex) 
     { 
      MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 
     finally 
     { 
      if (ConnectionState.Open.Equals(User.connection.State)) 
       User.connection.Close(); 
     } 
    } 
    else 
    { 
     return; 
    } 
} 

ama bu mesajı alıyorum:

Değişken @id ilan edilmiştir. Değişken adları içerisinde bir sorgu grubu veya saklı yordam içinde benzersiz olmalıdır.

bu değişkeni yeniden bir yolu var mı?

cevap

42

Parameters.AddWithValue gibi diyoruz komuta yeni Parametre ekler. Bunu, aynı ada sahip bir döngüde yaptığınız için, "Değişken adları benzersiz olmalıdır" istisnasını alıyorsunuz.

Yani sadece döngü önce ekleyin ve sadece döngü içinde değerdir değiştirmek, bir parametre gerekiyor.

command.CommandText = "DELETE FROM tbl_Users WHERE userID = @id"; 
command.Parameters.Add("@id", SqlDbType.Int); 
int flag; 
foreach (DataGridViewRow row in dgvUsers.SelectedRows) 
{ 
    int selectedIndex = row.Index; 
    int rowUserID = int.Parse(dgvUsers[0,selectedIndex].Value.ToString()); 
    command.Parameters["@id"].Value = rowUserID; 
    // ... 
} 

başka yolu da ilk command.Parameters.Clear(); kullanmaktır. Daha sonra aynı parametreyi iki kez oluşturmadan döngüdeki parametreleri de ekleyebilirsiniz.

0

Hata, yinelemenin her yinelemesinde aynı parametreyi tekrar tekrar eklediğinizden kaynaklanır. Gerektiğinde ben birden fazla yerden diyoruz böylece

ben ayrı yönteme bu kodu taşımak olacaktır.

public bool DeleteUser(int userId) 
{ 
    string connString = "your connectionstring"; 
    try 
    { 
     using (var conn = new SqlConnection(connString)) 
     { 
     using (var cmd = new SqlCommand()) 
     { 
      cmd.Connection = conn; 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = "DELETE FROM tbl_Users WHERE userID = @id"; 
      cmd.Parameters.AddWithValue("@id", userId); 
      conn.Open(); 
      cmd.ExecuteNonQuery(); 
      return true; 
     } 
     } 
    } 
    catch(Exception ex) 
    { 
     //Log the Error here for Debugging 
     return false; 
    } 

} 

O zaman bu

foreach (DataGridViewRow row in dgvUsers.SelectedRows) 
{ 
    int selectedIndex = row.Index; 
    if(dgvUsers[0,selectedIndex]!=null) 
    { 
    int rowUserID = int.Parse(dgvUsers[0,selectedIndex].Value.ToString()); 
    var result=DeleteUser(rowUserID) 
    } 
    else 
    { 
     //Not able to get the ID. Show error message to user 
    } 
} 
3

yerine:

command.Parameters.AddWithValue("@id", rowUserID); 

Kullanım şey gibi:

p.ParameterName = "@ID"; 
p.Value = rowUserID; 
: döngü içine manuel olarak ayarlanan sadece

System.Data.SqlClient.SqlParameter p = new System.Data.SqlClient.SqlParameter(); 
foreach dışında

ve

İlgili konular