Как установить для свойства rowstate значение «Удалено во время выполнения»?

1

Мне нужно установить свойство rowstate для удаления в Runtime необходимо изменить rowstate Modified to Deleted.

Поскольку я знаю, что вызов метода row.Delete() меняет состояние строки на Deleted, но также удаляет строку.

Здесь я просто хочу изменить rowstate на Deleted, но datarow не следует удалять:

Образец кода:

 Delete delete = new Delete()
                  .from("tb_lib_report_package_link")
                  .where()
                          .add().criteria("lib_report_id  = :pLibReportId ")
                          .and().criteria("package_Id  IN (" + packageLink + ")")
                  .endWhere();
            drow.AcceptChanges();
            drow.Delete();

            DataRow[] dra = new DataRow[] { drow };

             DbAccessManager accessManager = DbAccessFactory.GetDatabaseAccess(DatabaseType.Oracle, "Data Source=SRV",
                                                                              "DEV", "dev", this.AppCookieData["UserId"]);
            accessManager.ClientId = this.AppCookieData["UserId"];
            DbConnection cn = accessManager.CreateConnection();
            delete.ParameterSetter = new ParameterSetter((builder, param, index) =>
            {
                switch (builder.GetColumnName(param))
                {
                    case "pLibReportId":
                        param.DbType = this.ServerCfgReader.DefaultDBProvider.DBDataAccess.GetDbType(drow["LIB_REPORT_ID"].GetType());
                        param.Value = drow["LIB_REPORT_ID"];
                        break;
                    default:
                        throw new NotImplementedException();
                }
            });
            accessManager.Delete(delete, dra, cn);

В этом я получаю исключение: "Удаленная информация о строках не может быть доступна через строку".

  • 1
    какая польза от этого? Чего ты здесь пытаешься достичь? также покажите какой-нибудь код, который у вас есть в данный момент.
  • 0
    Смотрите здесь, я просто хочу изменить состояние строки, измененное на удаленное во время выполнения. В настоящее время у меня есть DataRow, состояние строки которого изменено, и на основе измененного состояния строки мне нужно вызвать метод Delete в моей структуре, но платформа обрабатывает только состояние удаленной строки в функции Delete.
Показать ещё 3 комментария
Теги:

2 ответа

3

Как из MSDN:

RowState будет удаляться после использования метода Delete в существующем DataRow. Он остается удаленным, пока вы не вызываете AcceptChanges. В это время DataRow удаляется из таблицы.

Так просто позвонить Delete и до AcceptChanges RowState будет Deleted, но грести сама не будут удалены из DataTable. Примечание: если вы удаляете datarow, состояние которого Added оно будет удалено из datatable сразу после вызова Delete

Обновить

Вы можете получить доступ к данным удаленной строки следующим образом:

var dt = new DataTable();
dt.Columns.Add("ID", typeof (long));
dt.Columns.Add("Name", typeof (string));

dt.Rows.Add(1, "xxx");
dt.Rows.Add(2, "yyy");

dt.AcceptChanges(); // now both rows are in 'Unchanged' state

dt.Rows[1].Delete(); // second row now in 'Deleted' state

foreach (DataRow dro in dt.Rows)
{
    if (dro.RowState == DataRowState.Deleted)
        // accessing deleted row
        Console.WriteLine("Deleted row: ID={0}, Name={1}", dro["ID", DataRowVersion.Original], dro["Name", DataRowVersion.Original]);
    else
        // accessing row as usual
       Console.WriteLine("Row: ID={0}, Name={1}", dro["ID"], dro["Name"]);
}

//putting into another array changes nothing in the manner of acessing deleted row
DataRow[] dra = new DataRow[] {dt.Rows[1]};
Console.WriteLine("Deleted row from another array: ID={0}", dra[0]["ID", DataRowVersion.Original]);
  • 0
    Энди, спасибо за ваше предложение, но когда я позвонил Удалить в Datarow, а позже, когда я передам тот же самый datarow, он выдаст исключение, поскольку он не будет содержать данных.
  • 0
    @ Джек Смотрите обновление моего ответа.
Показать ещё 12 комментариев
1

Нет, вы не можете этого сделать. Per Documentation RowState определяется как свойство только для чтения (имеет только getter), например

public DataRowState RowState { get; }
  • 0
    Тот факт, что RowState доступен только для чтения, в этом случае не имеет значения. Потому что там SetAdded и SetModified , AcceptChanges методы , которые изменяющие это свойство. И даже Delete до AcceptChanges пор, пока AcceptChanges не установит AcceptChanges в Deleted - так, как хочет OP.
  • 0
    Это правда, но я имею в виду, что вы не можете и не должны явно устанавливать свойство RowState для datarow, и это не имеет смысла.

Ещё вопросы

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