Я хочу получить данные из таблицы в базе данных в Datatable
и я хотел бы удалить несколько строк из Datatable
на основе значений и обновить изменения, внесенные в Datatable
в базе данных.
Я использую приведенный ниже код для удаления.
DataTable dt_table = new DataTable();
SqlConnection conn=new SqlConnection(connectionStr);
SqlCommand cmd = new SqlCommand("SELECT * FROM RT_Table", conn);
SqlDataAdapter sqlda = new SqlDataAdapter(cmd);
conn.Open();
sqlda.Fill(dt_table);
for (int i = 0; i < dt_table.Rows.Count; i++)
{
if (dt_table.Rows[i]["Name"].ToString()=="TEST")
{
dt_table.Rows.RemoveAt(i);
}
}
sqlda.Update(dt_table);
Метод RemoveAt
похоже, удаляет желаемое значение, но обновление не производится в базе данных.
Я смог выполнить INSERT
в Datatable и смог обновить таблицу в базе данных. Для вставки я использовал InsertCommand
.
Во-первых, вы должны создать SqlCommandBuilder
который предоставляет DeleteCommand
требуемый адаптером для выполнения удаления, тогда вы должны использовать метод Delete()
в строке, а не RemoveAt()
.
Эти два метода имеют различный смысл и цели
SqlCommandBuilder builder = new SqlCommandBuilder(sqlda);
foreach(DataRow row in dt_table.Rows)
{
if (row["Name"].ToString()=="TEST")
{
row.Delete();
}
}
sqlda.Update(dt_table);
Delete()
маркирует строку с флагом DataRowState.Deleted
а затем, когда вы вызываете Update()
DeleteCommand
DataAdapter
должен иметь возможность извлекать строки, помеченные этим флагом, и удалять их из таблицы базы данных. Вместо этого метод RemoveAt(i)
маркирует строку указанным флагом, но сразу вызывает AcceptChanges()
. Этот метод удаляет строку с DataRowState.Deleted
из коллекции строк в памяти. Таким образом, когда вы вызываете метод Update()
, нет строки с DataRowState.Deleted
и DataRowState.Deleted
не выполняется.
Calling RemoveAt is the same as calling Delete and then calling AcceptChanges.
Дьявол кроется в том, что AcceptChanges
.
DeleteCommand