dev.net.ua

Українська Спільнота Розробникiв
 
Ласкаво просимо до dev.net.ua Увійти | Приєднатися | Допомога | Увійти Live ID
в Пошук

Обновление БД из DataSet

Останнє повідомлення 27-05-2008, 15:10 від Максим. 5 відповіді.
Сортувати: Попереднє Наступне
  •  25-05-2008, 0:00 6175

    Обновление БД из DataSet

    Ситуация такова. Програмно обновляю DataSet из контрола (группы контролов). Интуитивно, по строению SqlDataAdapter, понимаю, что внесенные изменеия можно после этого автоматически сохранять в базе данных, с использованием того же (непараметризированного с помощью SqlCommand) SqlDataAdapter. Вместо этого сначала сохраняю данные в датасете, потом создаю параметризованный запрос на обновление БД, считываю измененные данные из датасета и с помощью запроса передаю в БД. Скажите, можно это делать попроще? И как?
    YURFACT+
  •  25-05-2008, 8:49 6180 у відповідь на 6175

    Re: Обновление БД из DataSet

    Задать свойство UpdateCommand для SqlDataAdapter и вызывать метод Update. Механизм останется тот же что и с собственным параметризированным запросом.

    С уважением, Вячеслав
  •  25-05-2008, 11:07 6186 у відповідь на 6180

    Re: Обновление БД из DataSet

    Пробовал с помощью SqlCommandBuilder:

    Dim _daDovObl As SqlDataAdapter

    Private Sub Frm_RtrNew_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    _daDovObl = DAFill(Me.DS, "DOVOBL") 'Me.DS - DataSet (на форме, но не типизирован), DOVOBL - таблица


    'Здесь код по присвоения значений контролам
    '...

    End Sub

    -----------------------------------------------------------------------------------------------------------


    'А тепeрь присваиваем значения записям DataSet (в данном случае - из TreeView):
    Private Sub TV_AfterLabelEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.NodeLabelEditEventArgs) Handles TV.AfterLabelEdit

    Dim tn As TreeNode = Me.TV.SelectedNode
    Dim dt As DataTable = PropertyNode(tn, mvPropertyTreeNodeClass.mvDataTable)
    Dim tit As String = PropertyNode(tn, mvPropertyTreeNodeClass.mvNameColumnTitle)
    Dim colId As String = PropertyNode(tn, mvPropertyTreeNodeClass.mvNameColumnId)
    Dim id As Integer = PropertyNode(tn, mvPropertyTreeNodeClass.mvID)
    Dim strRes As String = tn.Text

    If FindAndUpdateRow(dt, colId, id, tit, strRes) = True Then MsgBox("Yes!!!")

    End Sub


    -----------------------------------------------------------------------------------------------------------

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    UpdateDA(Me.DS, "DOVOBL", _daDovObl)
    End Sub

    -----------------------------------------------------------------------------------------------------------

    Public Function DAFill(ByVal Ds As DataSet, ByVal tblName As String, Optional ByVal strSQL As String = Nothing) _
    As SqlDataAdapter

    Dim stSQL As String

    If IsNothing(strSQL) Then
    stSQL = "SELECT * FROM " & tblName
    Else
    stSQL = strSQL
    End If

    Dim DA As New SqlDataAdapter(stSQL, OpenCnn.ConnectionString) 'Использую функцию подключения к БД (в ней храниться инфа о подключении,
    'оторое может изменяться

    DA.FillSchema(Ds, Source, tblName)
    DA.Fill(Ds, tblName)

    Return DA

    End Function

    -----------------------------------------------------------------------------------------------------------

    Public Function FindAndUpdateRow(ByVal dt As DataTable, ByVal colId As String, ByVal id As Integer, _
    ByVal colTit As String, ByVal strRes As String) As Boolean

    Try
    dt.PrimaryKey = New DataColumn() {dt.Columns(colId)}
    Dim row As DataRow = dt.Rows.Find(id)

    row(colTit) = strRes
    row.AcceptChanges()

    Return True

    Catch ex As Exception
    Return False

    End Try
    End Function

    Но БД все равно не обнавляется. Почему?
    YURFACT+
  •  26-05-2008, 6:28 6191 у відповідь на 6186

    Re: Обновление БД из DataSet

    После того как сформированны UpdateCommand/InsertCommand/DeleteCommand нужно делать

    da.Update(DS, tblName)

     

    AcceptChanges делает другую операцию, она помечает изменения в таблице как подтвержденные и стирает историю в памяти. По этому ее не нужно вызывать ДО Update

  •  26-05-2008, 9:54 6192 у відповідь на 6191

    Re: Обновление БД из DataSet

    kosinsky:

    После того как сформированны UpdateCommand/InsertCommand/DeleteCommand нужно делать


    da.Update(DS, tblName)


     


    AcceptChanges делает другую операцию, она помечает изменения в таблице как подтвержденные и стирает историю в памяти. По этому ее не нужно вызывать ДО Update



    В принципе, у меня это есть, только я забыл его прописать в форум:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    UpdateDA(Me.DS, "DOVOBL", _daDovObl) 'последнее из аргументов - датаадаптер (применяю потому что вроде бы SqlCommandBuilder должен видеть строку запроса при подключении для заливки данных в датасет с помощью адаптера
    End Sub

    Public Sub UpdateDA(ByVal Ds As DataSet, ByVal tblName As String, ByVal da As SqlDataAdapter)

    Using cnn As New SqlConnection(OpenCnn.ConnectionString) 'использую свою функцию коннекта
    Dim bdr As New SqlCommandBuilder(da)
    da.Update(Ds, tblName)
    End Using

    End Sub

    Но все равно не проходит. Я думал (и думаю), что DataAdapter должен генерировать изменения в БД, кешированные датасетом, а командбилдер только генерирует логику обновления исходя из кешированных в датасете изменений. Я не прав?
    Тоесть я считаю, что можно не задавать строк запросов, не перебирать построчно таблицу для внесения изменений, а оставить это адаптеру с билдером. Но похоже, я чего-то недопонимаю. На останове по последней комманде SqlDataAdapter.UpdateCommand = Nothing. А должно быть иначе? Тогда я сам должен указать строку запроса на обновление или это должен сделать билдер. Если я не прав, то объясните - почему. Если прав - то где ошибка?
    Что-то (если чесно) SqlDataBuilder мне не очень нравиться. Не рекомендуют его использовать и профи (из-за непредсказуемости - http://sql.ru/forum/actualthread.aspx?tid=391459&hl=sqlcommandbuilder). Подскажите, как его можно не использовать, а работать исключительно с адаптером?
    YURFACT+
  •  27-05-2008, 15:10 6199 у відповідь на 6192

    Re: Обновление БД из DataSet

    Вопрос решен. Каким-то образом мешала строка: row.AcceptChanges()
    YURFACT+
Переглядати як новосний Блог RSS в XML