У нас есть транзакции в Доступе MS?

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

Я имею ниже упомянутой ситуации.

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

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

17
задан skaffman 19 January 2010 в 09:44
поделиться

3 ответа

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

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

BEGIN TRANSACTION

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

COMMIT [TRANSACTION | WORK]

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

ROLLBACK [TRANSACTION | WORK]
11
ответ дан 30 November 2019 в 13:05
поделиться

На работе мне часто приходится накапливать большие наборы XML-документов для последующего анализа. Обычно это сделано, засунув их в справочник, и анализ сделан grep (или сделанная на заказ Явская программа со всеми ее ФАБРИЧНЫМИ/СТРОИТЕЛЯМИ/ОБЕРТКАМИ/API принадлежностями XML).

Однажды я подумал, что попробую поместить его в PostgreSQL. Есть две возможности, которые я хотел бы опробовать:

  • Автоматическое сжатие больших данных, когда это необходимо (TOAST).
  • Индексирование с использованием выражения.

Что касается первой функции, размер базы данных был меньше половины размера необработанных файлов. Выполнение полнотекстового поиска, сканирование таблицы с использованием WHERE data:: TEXT LIKE '% образец%' , было на самом деле быстрее, чем выполнение grep для файлов. Когда вы имеете дело с несколькими ГБ XML, это само по себе делает БД стоящей.

Вторая функция, индексация, - это немного больше работы для обслуживания. Было несколько конкретных элементов, которые, как я предположил, было бы полезно проиндексировать. Индекс на xpath ('//startHeader/startId/text () ', data) работает, но в каждом запросе может возникнуть боль при дублировании. Мне было проще добавлять обычные столбцы для некоторых полей и использовать триггеры вставки/обновления, чтобы синхронизировать их.

-121--3942023-

Вы можете всегда лучше работать с помощью malloc (), чтобы выделить большой объем памяти и разделить его самостоятельно. Malloc () был оптимизирован для хорошей работы в общем случае и не делает никаких предположений, используете ли вы потоки или каков может быть размер распределений программы.

Целесообразно ли реализовать собственный субраспределитель - вопрос второстепенный. Это редко так, явное управление памятью уже достаточно сложно. Вам редко нужен другой уровень кода, который может облажаться и разрушить вашу программу без какого-либо хорошего способа ее отладки. Если вы не пишете распределитель отладки.

-121--1388291-

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

14
ответ дан 30 November 2019 в 13:05
поделиться

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

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

1
ответ дан 30 November 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: