class MyTableAdapter : System.Data.IDbDataAdapter
{
private System.Data.SqlClient.SqlCommand m_SelectCommand = new System.Data.SqlClient.SqlCommand("SELECT * FROM `Employee`");
private System.Data.SqlClient.SqlCommand m_DeleteCommand = new System.Data.SqlClient.SqlCommand("DELETE FROM `Employee` WHERE (`Employee`.`id`=@EmployeeID)");
private System.Data.SqlClient.SqlConnection m_Connection = new System.Data.SqlClient.SqlConnection("строка для соеденения с БД");
/// <summary>
///
/// </summary>
/// <param name="EmployeeID">Параметр для удаления записи в БД</param>
/// <returns>Возврат количества удалённых записей</returns>
public int Delete(int EmployeeID)
{
m_DeleteCommand.Connection = m_Connection;
m_DeleteCommand.Connection.Open();
int count_delete = m_DeleteCommand.ExecuteNonQuery();
m_DeleteCommand.Connection.Close();
}
public DataTable GetTable()
{
m_SelectCommand.Connection = m_Connection;
m_SelectCommand.Connection.Open();
DataTable new_table;
/*тут oписываеш создание таблицы*/
m_SelectCommand.Connection.Close();
return new_table;
}
}
И снова обновление БД через TableAdapter
DataTable DealsTable = accountingDataSet.Tables["Deal"];
DataRowView MyRowView = (DataRowView)AcctTable.SelectedRows[0].DataBoundItem; // Берем текущую выбранную строчку в DataGridView, привязанном к DealsTable
DataRow MyRow = MyRowView.Row;
DealsTable.Rows.Remove(MyRow);
dealTableAdapter.Update(accountingDataSet);
--- cut ---
Вопрос: почему строка не удаляется из БД (при следующем запуске приложения строка на месте) ? Если я что-либо добавляю или меняю, все работает, метод Update() заносит изменения в базу.
Попробуй использовать dealTableAdapter.Delete(...);
А вообщето твоим кодом что ты написал, просто задаёш статус
System.Data.DataRowState.Deleted
а для применения этого статуса нужно подтвердить его в таблице и ДатаСете т адаптереТаблиц с помощью AcceptChanges() функции.
Как по мне то проще добавить в АдаптерТаблиц SQL запрос на удаление и перегружать данные в таблице.
Попробую примерно описать, по проще, в общих чертах.
Пример для MSSQL но так же применим для других баз
Код:
использование:
/* Создаём наш ТаблеАдаптер */
MyTableAdapter m_Adapter = new MyTableAdapter();
/* Загружаем данные в таблицу */
DataTable myTable = m_Adapter.GetTable();
/* Выбираем запись (надеясь что она есть ;) ) */
DataRow row = myTable.Rows[0];
/* Удаляем запись опираясь на ключивое значение ID */
m_Adapter.Delete(row["id"]);
/* и снова загружаем данные если всё прошло успешно */
myTable = m_Adapter.GetTable();
ну вот примерно так.
Но данный клас и процедуры можно генерировать самой студией.
Ну а можно и ручками писать
When a row is removed, all data in that row is lost. You can also call the Delete method of the DataRow class to just mark a row for removal. Calling Remove is the same as calling Delete and then calling AcceptChanges.
--- cut ---
Так что AcceptChanges() тут ни при чем.
Так вот, метод Update() работает исходя из статуса рядов. К такому выводу я пришел, прочитав о том, что метод Add() для DataRowCollection ставит Status = new для DataRow.
Следовательно, мне нужно только поменять статус. Remove() полностью выкидывает ряд из коллекции и он просто теряется.
Следующий код заработал без проблем:
Код:
DataRowView MyRowView = (DataRowView)AcctTable.SelectedRows[0].DataBoundItem; // Берем текущую выбранную строчку в DataGridView, привязанном к DealsTable
MyRowView.Row.Delete();
dealTableAdapter.Update(accountingDataSet);
MyRowView.Row.Delete();
dealTableAdapter.Update(accountingDataSet);