Отмена изменений в DataSet

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Отмена изменений в DataSet

Сообщение krukovis84 » 15.12.2009 (Вт) 0:23

Доброго времени суток!

Научился вносить данные в БД. Теперь возникла задача - организовать откат внесенных изменений.
В общем виде выглядит так: Вносим изменения в DataSet с помощью TableAdapter.Insert(fild1,...,fildN). Метод .Update еще не применил (непосредственно в БД еще ничего не внесли, только в DataSet) и задача откатить в исходное состояние. В момент, когда еще не произведен Insert. Знаю что DataSet хранит данные о первоначальном состоянии и о конечном. Как вернуть начальный вариант что то понять не могу.
Как бы вы это сделали?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Отмена изменений в DataSet

Сообщение Nord777 » 15.12.2009 (Вт) 0:56

DataSet.RejectChanges ?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Re: Отмена изменений в DataSet

Сообщение krukovis84 » 15.12.2009 (Вт) 22:09

DataSet.RejectChanges ?
- этот метод отменяет изменения в уже существующих строках (полях). А я строки добавляю. А такие изменения он не отменяет. Или я не знаю как он это делает). Подскажите поподробней, пожалуйста.

Sector
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 26.10.2004 (Вт) 14:43

Re: Отмена изменений в DataSet

Сообщение Sector » 16.12.2009 (Ср) 0:05

Может использовать транзакции и save points?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Отмена изменений в DataSet

Сообщение Nord777 » 16.12.2009 (Ср) 2:24

Прочти повнимательнее.
MSDN писал(а):Воспользуйтесь методом DataSet..::.RejectChanges, чтобы вызвать метод DataTable..::.RejectChanges для всех объектов DataTable, образованных классом DataSet.

Для всех объектов DataRow, образованных классом DataSet, можно задать режим изменения, вызвав метод DataRow..::.BeginEdit. После вызова метода DataRow..::.EndEdit изменения могут быть отменены путем вызова метода DataTable..::.RejectChanges для класса DataTable, содержащего объекты DataRow.

При вызове метода DataTable..::.RejectChanges отменяется изменение строк, находящихся в режиме изменения. Новые строки удаляются. Измененные и удаленные строки возвращаются в исходное состояние (DataRowState.Unchanged).

AcceptChanges и RejectChanges применимы только к изменениям, относящимся к DataRow (то есть к Add, Remove, Delete и Modify). Они не применимы к изменениям схемы или структуры.


Нижеследующий код это подтверждает.
Код: Выделить всё
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Dim Row1, Row2, Row3 As DataRow
      Dim DS As New DataSet()
      Dim DT As New DataTable("MyTable")

      DT.Columns.Add("Col1", GetType(String))
      DT.Columns.Add("Col2", GetType(String))
      DS.Tables.Add(DT)


      Row1 = DT.NewRow
      Row1(0) = "Row1_Val1" : Row1(1) = "Row1_Val2"

      Row2 = DT.NewRow
      Row2(0) = "Row2_Val1" : Row2(1) = "Row2_Val2"

      DT.Rows.Add(Row1)
      DT.Rows.Add(Row2)
      'DS.AcceptChanges()  '<--------------------
      Stop

      Row3 = DT.NewRow
      Row3(0) = "Row3_Val1" : Row3(1) = "Row3_Val2"
      DT.Rows.Add(Row3)

      DS.RejectChanges()  '<--------------------
      Stop

   End Sub
Это всё вручную.




Если ты цепляешь базу через дизайнер, то тут еще проще.
Он создает строго типизированные классы. Их методами и пользуйся.
Код: Выделить всё
   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      'Добавляем новую строку
      'Строка появляется в датагридвью, но в базу не заносится
      Me.PhotosDataSet.Albums.AddAlbumsRow(200, "ddddd")
   End Sub

   Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
      'Вносим изменения непосредственно в базу.
      Me.TableAdapterManager.UpdateAll(Me.PhotosDataSet)
   End Sub


Опиши более подробно свою задачу и приведи свой код,
тогда будет проще тебе помочь.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Re: Отмена изменений в DataSet

Сообщение krukovis84 » 16.12.2009 (Ср) 19:15

Nord777 писал(а):Если ты цепляешь базу через дизайнер, то тут еще проще.
Он создает строго типизированные классы. Их методами и пользуйся.
Код: Выделить всё
   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      'Добавляем новую строку
      'Строка появляется в датагридвью, но в базу не заносится
      Me.PhotosDataSet.Albums.AddAlbumsRow(200, "ddddd")
   End Sub

   Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
      'Вносим изменения непосредственно в базу.
      Me.TableAdapterManager.UpdateAll(Me.PhotosDataSet)
   End Sub



Ну вот я тоже самое и делаю как в этом примере. Отличие только в том, что я строку добавляю так: AlbumsTableAdapter.Insert(200, "ddddd").
Как теперь эти изменеия отменить? Например, если на Button3 не нажали еще, а на Button2 уже нажали. Т.е. в БД данные еще не занесены, а в памяти они уже хранятся.

В приведенных выше примерах все работает. Я даже попробовал поудалять строки и поредактировать - все возвращяет в исходную позицию.

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Re: Отмена изменений в DataSet

Сообщение krukovis84 » 16.12.2009 (Ср) 19:44

И вопросик по коду .AddAlbumsRow(200, "dddd") - поясните пожалуйста что значит 200 в общем случае? Что это за параметр?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Отмена изменений в DataSet

Сообщение Nord777 » 16.12.2009 (Ср) 20:00

И вопросик по коду .AddAlbumsRow(200, "dddd") - поясните пожалуйста что значит 200 в общем случае? Что это за параметр?
Есть таблица Albums.
У неё две колонки: ID и Name.
Соответственно .AddAlbumsRow(200, "dddd") добавляет строку в таблицу
с параметрами Id=200 и Name="dddd"


Отличие только в том, что я строку добавляю так: AlbumsTableAdapter.Insert(200, "ddddd").
Ну так а почему бы не воспользоваться методом строготипизированного(сгенерированного дизайнером) класса.
Я в данном случае использовал AddAlbumsRow

и напомню:
Nord777 писал(а):Опиши более подробно свою задачу и приведи свой код,
тогда будет проще тебе помочь.
Я понятия не имею, что и как ты сделал и что у тебя в коде.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Re: Отмена изменений в DataSet

Сообщение krukovis84 » 27.12.2009 (Вс) 19:42

Код: Выделить всё
    Private Sub btnVnesti_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVnesti.Click
        Dim shrtNulls As Short
        Dim strNulls As String
        Dim i As ULong
        'Проверка данных
        If ProverkaDannih() = False Then Exit Sub
        'Определение строки вставляемый как несколько нулей перед № полиса.
        shrtNulls = Len(tbFirstBlank.Text) - Len(CStr(CULng(tbFirstBlank.Text)))
        If shrtNulls = 0 Then
            strNulls = ""
        Else
            strNulls = Strings.StrDup(shrtNulls, "0")
        End If

        'Внесение бланков в БД.
        For i = CULng(tbFirstBlank.Text) To CULng(tbFinishBlank.Text)
            Tab_BlankTableAdapter.Insert(cbTipBSO.SelectedValue, tbSeria.Text & strNulls & CStr(i), cbSK.SelectedValue, DateAndTime.Today, 1, DateAndTime.Today, cbPartner.SelectedValue)
        Next
        'Me.Agent_DB_2000DataSet.tab_Blank.AcceptChanges()
        Tab_BlankTableAdapter.Fill(Me.Agent_DB_2000DataSet.tab_Blank)
    End Sub


   Private Sub btnOtmena_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOtmena.Click
        Agent_DB_2000DataSet.tab_Blank.RejectChanges()
        Tab_BlankTableAdapter.Fill(Me.Agent_DB_2000DataSet.tab_Blank)

    End Sub


Вот полный код того как я вношу данные и пытаюсь сделать отмену внесения.

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Re: Отмена изменений в DataSet

Сообщение krukovis84 » 27.12.2009 (Вс) 19:53

Ну так а почему бы не воспользоваться методом строготипизированного(сгенерированного дизайнером) класса.
Я в данном случае использовал AddAlbumsRow


У меня ID - счетчик. Т.е. если с помощью этого метода вставлять данные нужно обязательно знать ID. А с помощью TableAdapter.Insert - не нужно. По крайней мере ошибку не выдает. А в предыдущем случае - выдает. Или я что то не так делаю?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Отмена изменений в DataSet

Сообщение Nord777 » 28.12.2009 (Пн) 11:32

Только что изменил столбец Id - сделал его счетчиком.
Теперь метод AddAlbumsRow имеет всего один параметр.

Вобщем, ты чего-то неправильно делаешь.
Расскажи, как добавлял базу?
Должно быть что-то вроде этого:
vs_db.png
vs_db.png (25.81 Кб) Просмотров: 2565
Причем датагрид, панель навигации, все датасеты-адаптеры, всё это добавляется автоматом при перетягивании рисунка грида из окна "источники данных" на форму.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Re: Отмена изменений в DataSet

Сообщение krukovis84 » 13.01.2010 (Ср) 14:02

Я сделал скрин. Посмотрите пожалуйста что за параметр от меня требуется ввести?
Вложения
vbstreets.jpg
vbstreets.jpg (177.22 Кб) Просмотров: 2416

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Отмена изменений в DataSet

Сообщение Nord777 » 13.01.2010 (Ср) 18:48

что за параметр от меня требуется ввести?
Исходя из названия - новую строку.
Для начала надо её создать. Как то так
Dim Row As New Agent_DB_2000DataSet.tab_Blank_NameRow(....)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 82

    TopList