Есть ли у нас транзакции в MS-Access? - PullRequest
15 голосов
/ 16 января 2010

Я занимаюсь разработкой небольшого настольного приложения с использованием C # .NET и MS-Access . У меня нет опыта работы с MS-Access. Я хочу знать, можем ли мы использовать транзакции в Ms-Access или нет.

У меня нижеприведенная ситуация.

Вставить в Tbl1
Вставить в Tbl2

Я хочу вставить в tbl2 только тогда, когда вставка в tbl1 прошла успешно. И если есть какое-то исключение во время вставки в tbl2, я хочу откатить вставку в tbl1.
Я знаю, что это легко может быть достигнуто в sql-сервере, но в случае ms-доступа, как мне это сделать. Пожалуйста, помогите, заранее спасибо.

Ответы [ 3 ]

13 голосов
/ 17 января 2010

Никто на самом деле не дал вам никаких примеров кода здесь в ответе и даже не привел пример (хотя файлы справки Access содержат примеры). Ключевой вопрос, который нужно иметь в виду, заключается в том, что в Jet / ACE (Access не поддерживает транзакции сам по себе - это зависит от того, какой механизм базы данных вы используете для этого), что транзакция контролируется на уровне рабочей области. Вы можете создать новое рабочее пространство для вашей транзакции или создать новое. Вот пример кода:

  On Error GoTo errHandler
    Dim wrk As DAO.Workspace
    Dim db As DAO.Database
    Dim lngInvoiceID As Long

    Set wrk = DBEngine.Workspaces(0)
    Set db = wrk.OpenDatabase(CurrentDb.Name)
    With wrk
      .BeginTrans
      db.Execute "INSERT INTO tblInvoice (CustomerID) VALUES (123);", dbFailOnError
      lngInvoiceID = db.OpenRecordset("SELECT @@IDENTITY")(0)
      db.Execute "INSERT INTO tblInvoiceDetail (InvoiceID) VALUES (" & lngInvoiceID & ")", dbFailOnError
      .CommitTrans
      Debug.Print "Inserted Invoice header and detail for Invoice " & lngInvoiceID
    End With

  exitRoutine:
    If Not (db Is Nothing) Then
       db.Close
       Set db = Nothing
    End If
    Set wrk = Nothing
    Exit Sub

  errHandler:
    MsgBox Err.Number & ": " & Err.Description, vbExclamation, "Error in transaction"
    wrk.Rollback
    Resume exitRoutine

(код проверен и работает в Access)

10 голосов
/ 16 января 2010

Похоже, что мы делаем: MSDN - оператор транзакции (Microsoft Access SQL)

Транзакции не запускаются автоматически. Чтобы начать транзакцию, вы должны сделать это явно, используя:

BEGIN TRANSACTION

Завершите транзакцию, совершив все работы, выполненные во время транзакции:

COMMIT [TRANSACTION | WORK]

Завершение транзакции путем отката всех работ, выполненных во время транзакции:

ROLLBACK [TRANSACTION | WORK]
1 голос
/ 16 января 2010

Да, Microsoft Access поддерживает транзакции, и они работают довольно хорошо. Я создал коммерческое POS-приложение, используя Access в качестве базы данных несколько лет назад, и поддержка транзакций работала очень хорошо.

Тем не менее, если это возможно, я бы использовал SQL Server Express. Это бесплатно и намного мощнее, чем Access.

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