Кажется, что метод RemoveAt удаляет желаемое значение, но обновление не выполняется в базе данных

1

Я хочу получить данные из таблицы в базе данных в 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.

  • 0
    Проверьте ваш DeleteCommand
Теги:
visual-studio-2010

1 ответ

2
Лучший ответ

Во-первых, вы должны создать 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 не выполняется.

  • 0
    Ваше решение совершенно верно, но не ваша причина. Из MSDN: Calling RemoveAt is the same as calling Delete and then calling AcceptChanges. Дьявол кроется в том, что AcceptChanges .
  • 0
    Проголосуй конечно
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню