Как добавить транзакции с помощью набора данных, созданного с помощью мастера добавления соединений? - PullRequest
1 голос
/ 16 апреля 2010

У меня есть набор данных, который я добавил в свой проект, где я могу вставлять и добавлять записи с помощью функции «Добавить запрос» в Visual Studio 2010, однако я хочу добавить транзакции к этому, я нашел несколько примеров, но, похоже, не могу найдите тот, который работает с ними.

Я знаю, что мне нужно как-то использовать класс SQLClient.SQLTransaction. Я использовал мастер добавления нового источника данных и добавил нужные мне таблицы / представления / функции, мне просто нужен пример, использующий этот процесс, например, Как получить соединение данных, которое использовал мой DataSet. Предполагая, что все параметры были установлены в мастере, и я использую только предопределенные адаптеры и параметры, запрошенные в этом мастере, как добавить логику транзакций в мою базу данных.

Например, у меня есть DataSet с именем ProductDataSet с XSD, созданным для этого, затем я добавил свою таблицу Stock в качестве источника данных и добавил метод AddStock с помощью мастера, это также, если новый элемент вызывает метод AddItem, если либо из этих сбоев я хочу откат AddItem и AddStock в этом случае.

Ответы [ 3 ]

3 голосов
/ 27 апреля 2010

В этом примере у меня есть набор данных с именем "dsMain" и несколько прямых запросов в "QueriesTableAdapter".Я расширяю частичный класс для TableAdapter с помощью функции, которая будет создавать транзакцию на основе первого (0) соединения, а затем применять ее к каждому соединению в адаптере таблицы.

Namespace dsMainTableAdapters
    Partial Public Class QueriesTableAdapter
        Public Function CreateTransaction() As Data.IDbTransaction   
            Dim oConnection = Me.CommandCollection(0).Connection
            oConnection.Open()

            Dim oTrans = oConnection.BeginTransaction()

            For Each cmd In Me.CommandCollection
                cmd.Connection = oConnection
                cmd.Transaction = oTrans
            Next

            Return oTrans
        End Function
    End Class
End Namespace

Вы начинаете транзакцию свызов новой функции

Dim qa As New dsMainTableAdapters.QueriesTableAdapter
Dim oTrans = qa.CreateTransaction()

Затем вы можете вызывать запросы TableAdapter внутри вашей транзакции

qa.Query1
qa.Query2

Когда вы закончите свои запросы, вы совершите транзакцию

oTrans.Commit()

Вы можете сделать то же самое для любого TableAdapter, который был создан для ваших наборов данных.Если у вас есть несколько адаптеров таблиц, которые должны использовать одну и ту же транзакцию, то в дополнение к «CreateTransaction» вы должны сделать «SetTransaction» и указать, что Transaction является параметром.

0 голосов
/ 25 мая 2010

Это не проверено, но именно так я и должен представлять комбо CreateTransaction / SetTransaction (с вашим объектом OdbcTransaction).

Public Function CreateTransaction() As System.Data.Odbc.OdbcTransaction
    Dim oConnection = Me.CommandCollection(0).Connection
    oConnection.Open()

    Dim oTrans = oConnection.BeginTransaction()

    SetTransaction(oTrans)

    Return oTrans
End Function


Public Sub SetTransaction(ByVal oTrans As System.Data.Odbc.OdbcTransaction)
    For Each cmd In Me.CommandCollection
        cmd.Connection = oTrans.Connection
        cmd.Transaction = oTrans
    Next
End Sub
0 голосов
/ 20 мая 2010

Прежде всего, спасибо за ваш ответ, Картер, это мне очень помогло!

но я не могу обработать деталь с параметрами

Вы можете сделать то же самое для любого TableAdapter, который был создан для ваших наборов данных. Если у вас есть несколько адаптеров таблиц, которые должны использовать одну и ту же транзакцию, то в дополнение к «CreateTransaction» вы должны сделать «SetTransaction» и указать, что Transaction является параметром.

, поэтому я могу обрабатывать 1 транзакцию с 1 табличным адаптером, но не 1 транзакцию с 2 табличными адаптерами:

Я делаю это для школьного проекта, и мне очень нужна твоя помощь !! Вот код для добавления нового материала и исторической цены (изменяющаяся цена, например, на топливо; я сохраняю ее в связанной таблице для материала в базе данных):

Namespace DataSetTableAdapters
Partial Public Class MaterialPriceTableAdapter
Public Function SetTransaction() As Data.IDbTransaction

        Dim oConnection = Me.CommandCollection(0).Connection
        oConnection.Open()

        Dim oTrans = oConnection.BeginTransaction()

        For Each cmd In Me.CommandCollection
            cmd.Connection = oConnection
            cmd.Transaction = oTrans
        Next

        Return oTrans
    End Function
End Class

Partial Public Class MaterialTableAdapter

    Public Function CreateTransaction(ByVal MaterialPrice As System.Data.Odbc.OdbcTransaction) As Data.IDbTransaction

        Dim oConnection = Me.CommandCollection(0).Connection
        oConnection.Open()

        Dim oTrans = oConnection.BeginTransaction()

        For Each cmd In Me.CommandCollection
            cmd.Connection = oConnection
            cmd.Transaction = oTrans
        Next

        Return oTrans
    End Function
End Namspace

`

и теперь код в форме:

Public Class AddMaterial
Dim material As New DataSetBATableAdapters.MaterialTableAdapter
Dim materialprice As New DataSetBATableAdapters.MaterialPriceTableAdapter
Dim oTrans = material.CreateTransaction(materialprice.SetTransaction())

Private Sub Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Save.Click
    Try
        material.InsertQuery(NameTextBox.Text, UnitComboBox.SelectedValue)
        materialprice.InsertQuery(Date_BeginDateTimePicker.Value, PriceTextBox.Text, Date_EndDateTimePicker.Value, Me.LkwTableAdapter.ScalarQuery())
        oTrans.Commit()
    Catch ex As Exception
        oTrans.Rollback()
        MsgBox("Error by Insert")
    End Try
    Me.Close
End Sub
End Class

если я сохраняю новую запись, otrans.commit не отправляет файл materialprice.insertquery. Что я делаю неправильно? если у вас есть идея, что это, пожалуйста, скажите мне

спасибо, Xeras

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...