2016-03-07 2 views
1

Я пытаюсь создать приложение, которое будет содержать DataGridView с данными, привязанными к DataSource. Я использую метод заполнения в Form_Load, и мне хотелось бы знать, как удалить одну или несколько отмеченных строк не только из моей таблицы, но и из базы данных/источника данных одновременно.C# Удаление строк из DataGridView и базы данных обновлений

Этот код используется на кнопке удаления, но он не удаляет навсегда выбранные строки. Любая помощь?

for (int i = 0; i < Products.Rows.Count; i++) 
{ 
    DataGridViewRow dr = Products.Rows[i]; 
    if (dr.Selected == true) 
    { 
     Products.Rows.RemoveAt(i); 
    } 
} 
+0

Чтобы удалить выбранные строки, вам необходимо сделать вызов базы данных. –

+0

База данных уже существует и загружается при запуске приложения. Проблема заключается в том, что при удалении 1 или более флажков строк с помощью кнопки «Удалить» эти строки исчезают, но снова будут возвращены, если я перезапущу программу. Любые идеи, как я могу обновить эти изменения в базе данных? – SarahF

+0

Можете ли вы указать, какую базу данных вы используете. MS SQL Server или MySQL или Oracle и т. Д.? –

ответ

0

Вы должны написать необходимый звонок менеджеру БД. Если вы используете MYSQL, то вы можете использовать:

for (int i = 0; i < Products.Rows.Count; i++) 
{ 
    DataGridViewRow dr = Products.Rows[i]; 
    if (dr.Selected == true) 
    { 
     Products.Rows.RemoveAt(i); 
     // CODE ADDED 
     MySqlCommand cmd = sql.CreateCommand(); // creates the MySQL object needed for queries (I think there's another way also, but I use this) 
     cmd.CommandText = "DELETE FROM table WHERE id = 1"; // sets the query 

     try 
     { 
      cmd.ExecuteNonQuery(); // executes the query 
     } 
     catch(MySqlException e) 
     { 
      sql.Close(); 
      Console.WriteLine(e.Message); 
     } 
     sql.Close(); 
     // CODE ADDED 
    } 
} 

sql был определен как до MySqlConnection sql, и это инициализация была:

try { 
    sql = new MySqlConnection({SQL_CONNECTION_STRING}); 
    try 
    { 
     sql.Open(); 
     sql.Close(); // Close the DB. This block is useful to check whether or not the connection was successfully opened 
    } 
    catch (MySqlException e) 
    { 
     Console.WriteLine(e.Message); 
    } 
} 
catch (MySqlException e) 
{ 
    Console.Write(e.Message); 
} 
0
if (MessageBox.Show("Confirm ?","DELETE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) 
{ 
    string name = dataGridView1.Rows[e.RowIndex].Cells[WHEREINDEX].Value.ToString(); 
    sql = "DELETE FROM [TABLE] WHERE [id] = " + dataGridView1.Rows[e.RowIndex].Cells[WHEREINDEX].Value.ToString(); 

    if (db.Exec(sql) > 0) 
    { 
     MessageBox.Show(name + " deleted"); 
     dtSummary.Rows.Find(dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString()).Delete(); 
     dataGridView1.Refresh(); 
    } 
    else 
    { 
     MessageBox.Show("error while deleting") 
    } 
} 
0

Что вы делаете, удаление выбранных строк только от DataGridView.

Вы не производите вызов базы данных для удаления строк.

Предполагаю, что вы используете сервер Microsoft SQL.

В этом случае вам нужно будет получить то, что однозначно идентифицирует продукт. Например, идентификатор продукта.

Предполагая, что у вас есть столбец ProductId из базы данных, связанный с некоторым столбцом в DataGridView.

Ваш код должен быть следующим.

//string variable to capture product Ids for selected products 
System.Text.StringBuilder productIds = new System.Text.StringBuilder(string.empty); 

for (int i = 0; i < Products.Rows.Count; i++) 
{ 
    DataGridViewRow dr = Products.Rows[i]; 

    if (dr.Selected == true) 
    { 
     Products.Rows.RemoveAt(i); 

     productIds.Append(productIds.length > 0 ? "," + Convert.ToString(dr["ProductId"]) : Convert.ToString(dr["ProductId"])); 
    } 
} 

DeleteProducts(productIds.ToString()); 

Теперь ваш метод DeleteProducts должен быть следующим.

private int DeleteProducts(string productIds) 
{ 
    int recordsDeleted = 0; 

    using (SqlConnection conn = new SqlConnection("Your connection string here")) 
    { 
     try 
     { 
      using (SqlCommand cmd = new SqlCommand("Your SQL Stored Procedure name here", conn)) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 

       SqlParameter paramProductIds = new SqlParameter("@productIds", varchar(2000)); 
       paramProductIds.Value = productIds; 

       cmd.Parameters.Add(paramProductIds); 

       conn.Open(); 

       recordsDeleted = cmd.ExecuteNonQuery(); 
      } 
     } 
     finally { conn.Close(); } 

    } 

    return recordsDeleted; 
} 

И ваша хранимая процедура должна быть такой, как указано ниже (Предполагая MS SQL Server).

CREATE PROCEDURE DeleteProducts 
    @productIds VARCHAR(2000) 
AS 
BEGIN 
    DELETE FROM Products WHERE ProductId IN (SELECT item FROM dbo.Split(',', @productIds)) 
END 
Смежные вопросы