Вопрос:
В приведенном ниже коде “Обновление требует действительного DeleteCommand при передаче коллекции DataRow с удаленными строками”. имею в виду?
foreach (DataGridViewRow item in this.dataGridView2.SelectedRows) { fuelStopsDataSet1.Tables[0].Rows[item.Index].Delete(); } this.fuelStopsTableAdapter.Update(this.fuelStopsDataSet1.FuelStops); Лучший ответ:
Это означает, что вы используете DataAdapter обновить таблицу, которая содержит удаленные DataRows (их RowState является Deleted). Затем DataAdapter использует указанный DeleteCommand для удаления этой строки в базе данных. Но вы не предоставили его.
Поэтому вам нужно предоставить его.
Пример MSDN:
public static SqlDataAdapter CreateCustomerAdapter( SqlConnection connection) { SqlDataAdapter adapter = new SqlDataAdapter(); // Create the SelectCommand. SqlCommand command = new SqlCommand(«SELECT * FROM Customers » + «WHERE Country = @Country AND City = @City», connection); // Add the parameters for the SelectCommand. command.Parameters.Add(«@Country», SqlDbType.NVarChar, 15); command.Parameters.Add(«@City», SqlDbType.NVarChar, 15); adapter.SelectCommand = command; // Create the InsertCommand. command = new SqlCommand( «INSERT INTO Customers (CustomerID, CompanyName) » + «VALUES (@CustomerID, @CompanyName)», connection); // Add the parameters for the InsertCommand. command.Parameters.Add(«@CustomerID», SqlDbType.NChar, 5, «CustomerID»); command.Parameters.Add(«@CompanyName», SqlDbType.NVarChar, 40, «CompanyName»); adapter.InsertCommand = command; // Create the UpdateCommand. command = new SqlCommand( «UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName » + «WHERE CustomerID = @oldCustomerID», connection); // Add the parameters for the UpdateCommand. command.Parameters.Add(«@CustomerID», SqlDbType.NChar, 5, «CustomerID»); command.Parameters.Add(«@CompanyName», SqlDbType.NVarChar, 40, «CompanyName»); SqlParameter parameter = command.Parameters.Add( «@oldCustomerID», SqlDbType.NChar, 5, «CustomerID»); parameter.SourceVersion = DataRowVersion.Original; adapter.UpdateCommand = command; // Create the DeleteCommand. command = new SqlCommand( «DELETE FROM Customers WHERE CustomerID = @CustomerID», connection); // Add the parameters for the DeleteCommand. parameter = command.Parameters.Add( «@CustomerID», SqlDbType.NChar, 5, «CustomerID»); parameter.SourceVersion = DataRowVersion.Original; adapter.DeleteCommand = command; return adapter; }
Последняя команда – DeleteCommand.
Ответ №1
Вы можете создать DeleteCommand автоматически в некоторых ситуациях (выведенный из SelectCommand).
SqlDataAdapter da = new SqlDataAdapter(«…SELECT Statement…», connection); SqlCommandBuilder cmd_b = new SqlCommandBuilder(da); // this already creates // the Update- and DeleteCommands for the DA
Вот статья об этом:
http://msdn.microsoft.com/library/vstudio/tf579hcz.aspx