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 Longhost = "SQLSVODBC32"
user = "demo"
pass = "demo"
fName = "C:\Dev\code\vscode\excel\17ISHIKA.CSV"
fd = FreeFileconn = "DSN=" & host & ";UID=" & user & ";PWD=" & pass
Open fName For Input As #fdSet 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. より 1strSQL = "TRUNCATE TABLE POSTAL"
trLevel = adoCon.BeginTrans '1. よりトップ レベルのトランザクション = 1
Debug.Print trLevelCall adoCon.Execute(strSQL, 0)
While Not EOF(fd)
Line Input #fd, strLinestrLine = 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)
WendadoCon.CommitTrans
trLevel = trLevel - 1
Debug.Print adoCon.StateadoCon.Close
Set adoCon = Nothing
Close #fd
dbSetCSV = True
Exit FunctionERR_PROC:
trLevel = trLevel - 1
adoCon.Close
Set adoCon = Nothing
Close #fd
dbSetCSV = FalseEnd Function