2010-04-16 1 views
1

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

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

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

+1

Вы также можете посмотреть класс 'System.Transactions.TransactionScope'. –

+0

Спасибо тоже посмотрел на это, но не был уверен, что он был использован для этой цели, возможно, пропустил его, однако, спасибо, что упомянул об этом. – RoguePlanetoid

+0

Если есть примеры добавления транзакций, когда мастер был использован для создания источника данных и набора данных, пожалуйста, обратитесь к ним или укажите их здесь. – RoguePlanetoid

ответ

3

В этом примере у меня есть набор данных, называемый «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, который был создан для ваших наборов данных. Если у вас несколько TableAdapters, которые должны использовать одну и ту же транзакцию, то в дополнение к «CreateTransaction» вы должны сделать «SetTransaction» и иметь параметр Transaction.

+0

Спасибо, выглядит интересно, не могу попробовать сейчас, но это похоже на то, что мне нужно - будет отмечать как ответ, если я его заработаю. – RoguePlanetoid

0

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

но IAM не в состоянии обрабатывать часть с параметрами

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

так IAM способен обрабатывать 1 сделок с 1 TableAdapter, но не одна сделка с 2 TableAdapters:

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

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 

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

спасибо, Xeras

+0

Мое решение для этой проблемы, когда вам нужно передать объект Transaction, было использование одного адаптера таблицы с инструкциями вставки, поскольку я не мог заставить объект транзакции сохраняться правильно, надеюсь, что есть способ получить один объект транзакции чтобы упорствовать между TableAdapters, но я пробовал несколько вещей, и они не работали для меня, но они могут для вас. – RoguePlanetoid

+0

haha ​​это работает для меня :)), я пишу оба заявления вставки из одного и того же табличного адаптера, никогда не думал об этом, очень приятно спасибо looooot !!! – user338362

+0

Рад, что это помогло! Я тоже не думал об этом, это было только потому, что я мог заставить его работать с одним адаптером, но не с двумя, что мне приходилось вставлять все вставки в первый адаптер, и это сработало, даже если они были для разных столы. – RoguePlanetoid

0

Это проверялось, но это, как я визуализации комбо 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