Excel VBA での Transaction について

環境はWin10 Pro x64 + Excel2013 x32 + SQL Server 2016 Express x64
使用したデータはこちら郵便番号検索の17ISHIKA.CSV
使用したテーブルはこちら

元ネタはこちら
1.BeginTrans、CommitTrans、RollbackTrans メソッド
2.ObjectStateEnum

1.より抜粋
ネストされたトランザクションをサポートしているプロバイダの場合、開いているトランザクションで BeginTrans メソッドを呼び出すと、ネストされた新規トランザクションが開始されます。戻り値は、ネストのレベルを示します。戻り値 "1" はトップ レベルのトランザクション (ほかのトランザクション内でネストしていないトランザクション)、"2" はセカンド レベルのトランザクション (トップ レベルのトランザクション内でネストしているトランザクション) が開いたことを示します ("3" 以下も同様です)。CommitTrans または RollbackTrans メソッドを呼び出すと、最後に開いたトランザクションのみを操作します。さらに上のレベルのトランザクションを処理するには、カレント トランザクションを閉じるか、またはロール バックする必要があります。

2.より抜粋

ObjectStateEnum

定数 説明
adStateClosed 0 オブジェクトが閉じていることを示します。
adStateOpen 1 オブジェクトが開いていることを示します。
adStateConnecting 2 オブジェクトが接続していることを示します。
adStateExecuting 4 オブジェクトがコマンドを実行中であることを示します。
adStateFetching 8 オブジェクトの行が取得されていることを示します。


ADO/WFC 等価

パッケージ: com.ms.wfc.data

定数
AdoEnums.ObjectState.CLOSED
AdoEnums.ObjectState.OPEN
AdoEnums.ObjectState.CONNECTING
AdoEnums.ObjectState.EXECUTING
AdoEnums.ObjectState.FETCHING


テーブル
CREATE TABLE [dbo].[POSTAL](
[POSTAL] [nchar](8) NULL,
[PREF] [nchar](20) NULL,
[CITY] [nchar](40) NULL,
[ADRLINE1] [nchar](40) NULL,
[ADRLINE2] [nchar](40) NULL,
[ADRLINE4] [nchar](40) NULL
) ON [PRIMARY]

Private Function setCSV2DB() As Boolean

On Error GoTo ERR_PROC

Dim adoCon As ADODB.Connection
Dim adoRst As ADODB.Recordset
Dim vAry As Variant
Dim host As String
Dim user As String
Dim pass As String
Dim conn As String
Dim strSQL As String
Dim fd As Integer
Dim strLine As String
Dim fName As String
Dim trLevel As Long

host = "SQLSVODBC32"
user = "demo"
pass = "demo"
fName = "C:\Dev\code\vscode\excel\17ISHIKA.CSV"
fd = FreeFile

conn = "DSN=" & host & ";UID=" & user & ";PWD=" & pass
Open fName For Input As #fd

Set adoCon = New ADODB.Connection
adoCon.ConnectionString = conn
adoCon.CursorLocation = adUseClient

Debug.Print adoCon.State '2. より 0

Call adoCon.Open
trLevel = 0
Debug.Print adoCon.State '2. より 1

strSQL = "TRUNCATE TABLE POSTAL"
trLevel = adoCon.BeginTrans '1. よりトップ レベルのトランザクション = 1
Debug.Print trLevel

Call adoCon.Execute(strSQL, 0)

While Not EOF(fd)
Line Input #fd, strLine

strLine = Replace(strLine, """", "")
vAry = Split(strLine, ",")
strSQL = "INSERT INTO POSTAL (POSTAL, CITY, ADRLINE1) VALUES "
strSQL = strSQL & "('" & Trim(vAry(2)) & "','" & Trim(vAry(7)) & "','" & Trim(vAry(8)) & "')"
Call adoCon.Execute(strSQL, 0)
Wend

adoCon.CommitTrans
trLevel = trLevel - 1
Debug.Print adoCon.State

adoCon.Close
Set adoCon = Nothing
Close #fd
dbSetCSV = True
Exit Function

ERR_PROC:
trLevel = trLevel - 1
adoCon.Close
Set adoCon = Nothing
Close #fd
dbSetCSV = False

End Function