2017-01-26 5 views
1

Во время транзакционного блока, если часть его не работает или прерывается, что является лучшим способом справиться с этим?PostgreSQL/VBA: проверка отказа транзакции или процесс

Я думаю о промежуточных запросах (см. Комментарии к коду), чтобы подтвердить, что предыдущий запрос был успешным. Или есть лучший способ?

Sub SetDataProcessPriorities() 

Dim cCon As New ADODB.Connection 
Set cCon = Application.Run("Personal.xlsb!ConnectToPg") 
Call Application.Run("Personal.xlsb!SendPgQueryOnly", "begin;", cCon) 

Call Application.Run("Personal.xlsb!SendPgQueryOnly", "delete from data_proc_pri;", cCon) 
    'intermediate select query here?              
Call Application.Run("Personal.xlsb!SendPgQueryOnly", "insert into data_proc_pri            select * from data_proc_pri_store;", cCon) 
    'intermediate select query here?              
Call Application.Run("Personal.xlsb!SendPgQueryOnly", "commit;", cCon) 
End Sub 

Я открыт для решения VBA (извините) или PostgreSQL (или обоих).

Бонусный вопрос: Как вы называете этот тип программирования? Программирование инфраструктуры?

Персональный код книги, если вам это нужно:

Sub SendPgQueryOnly(sSql As String, Optional cCon As ADODB.Connection, Optional sOdbcName As String = "[omitted]") 
sCaller = "SendPgQueryOnly" 

    Dim cnDB As New ADODB.Connection 

    Dim rsRecords As New ADODB.Recordset 

    If IsMissing(cCon) Or cCon Is Nothing Then 
     cnDB.Open sOdbcName 
     rsRecords.CursorType = 2 'adOpenDynamic 
     rsRecords.Open sSql, cnDB 
    Else 
     rsRecords.CursorType = 2 'adOpenDynamic 
     rsRecords.Open sSql, cCon 'use the passed connection obj 
    End If 


cleanup: 
    Set rsRecords = Nothing 
    Set cnDB = Nothing 
End Sub 

Function ConnectToPg(Optional sOdbcName As String = "[omitted]") As ADODB.Connection 
    sCaller = "ConnectToPg" 

    Dim cnDB As New ADODB.Connection 

    cnDB.Open sOdbcName 
    Set ConnectToPg = cnDB 
    End Function 

ответ

0

Для транзакционного управления вы можете использовать методы BeginTrans, CommitTrans и RollbackTrans на объекте Connection

https://msdn.microsoft.com/en-us/library/ms680895(v=vs.85).aspx

Хотя один имеет степень стиля программирования и широту, учитывая конкретную проблему. Я предполагаю, что можно запросить базу данных с помощью некоторых запросов Select, чтобы гарантировать, что состояние базы данных было изменено, как ожидалось; если, как ожидалось, затем зафиксировать, а если нет, то откат.

Смежные вопросы