У нас есть транзакции в MS-Access?

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

У меня есть следующая ситуация.

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

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

Ответы

Ответ 1

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

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

BEGIN TRANSACTION

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

COMMIT [TRANSACTION | WORK]

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

ROLLBACK [TRANSACTION | WORK]

Ответ 2

Никто в действительности не дал вам никаких примеров кода в ответе или даже привел пример (хотя файлы справки 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)

Ответ 3

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

Даже если это возможно, я бы использовал SQL Server Express. Он бесплатный и гораздо более мощный, чем Access.