VBA SQL Serverに接続してADODB.RecordsetのAddNewを使用してInsertする
VBAで、SQL Serverに接続してADODB.RecordsetのAddNewを使用してInsertするコードを記述してます。
環境
- OS windows10 64bit
AddNewを使用してInsert
実際に適当なボタンを用意して、AddNewを使用してセルの値をInsertしていく
以下のソースコードを記述します。
DBは「sample」というDBで、テーブルは下図の列が定義された「Test」を使用します。
挿入するセルデータ
ソースコード
Option Explicit
Private Const PROVIDER As String = "SQLOLEDB"
Private Const DATA_SOURCE As String = "localhost" 'サーバ名
Private Const DATABASE As String = "sample" 'データベース名
'SQL Server認証で接続する場合
Private Const USER_ID As String = "sa" 'ユーザID
Private Const PASSWORD As String = "password" 'ユーザパスワード
Private Sub CommandButton1_Click()
On Error GoTo EXCEPTION_SECTION
Const PROCEDURE_NAME As String = "CommandButton1_Click"
Dim strSQL As String
Dim i As Long
Dim adoCn As Object
Dim adoRs As Object
'--------------------------------
' データベース接続
'--------------------------------
Set adoCn = CreateObject("ADODB.Connection")
'SQL Server認証
adoCn.ConnectionString = "Provider=" & PROVIDER _
& ";Data Source=" & DATA_SOURCE _
& ";Initial Catalog=" & DATABASE _
& ";UID=" & USER_ID _
& ";PWD=" & PASSWORD
' オープン
adoCn.Open
Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクト
i = 1
With adoRs
.Open "Test", adoCn, 1, 3 'レコードセットを開く(1:キーセットカーソル 3:レコードごとの共有的ロック)
Do While Cells(i, 1).Value <> ""
.AddNew
!ID = Cells(i, 1).Value
!Name = Cells(i, 2).Value
.Update
i = i + 1
Loop
.Close 'レコードセットのクローズ
End With
GoTo EXIT_SECTION
EXCEPTION_SECTION:
With Err
MsgBox (.Description), vbOKOnly + vbExclamation + vbSystemModal, PROCEDURE_NAME
End With
GoTo EXIT_SECTION
EXIT_SECTION:
' レコードセットのクローズ
If Not adoRs Is Nothing Then
If adoRs.State = 1 Then adoRs.Close ' 開かれていればクローズ
Set adoRs = Nothing
End If
' データベースのクローズ
If Not adoCn Is Nothing Then
If adoCn.State = 1 Then adoCn.Close ' 開かれていればクローズ
Set adoCn = Nothing
End If
MsgBox ("終了")
End Sub
実行後に、データがinsertされていることが確認できます。
存在チェックをした上で、「insert」する場合は以下のコードになります。
Option Explicit
Private Const PROVIDER As String = "SQLOLEDB"
Private Const DATA_SOURCE As String = "localhost" 'サーバ名
Private Const DATABASE As String = "sample" 'データベース名
'SQL Server認証で接続する場合
Private Const USER_ID As String = "sa" 'ユーザID
Private Const PASSWORD As String = "password" 'ユーザパスワード
Private Sub CommandButton1_Click()
On Error GoTo EXCEPTION_SECTION
Const PROCEDURE_NAME As String = "CommandButton1_Click"
Dim strSQL As String
Dim flg As Boolean
Dim id As Long
Dim i As Long
Dim adoCn As Object
Dim adoRs As Object
'--------------------------------
' データベース接続
'--------------------------------
Set adoCn = CreateObject("ADODB.Connection")
'SQL Server認証
adoCn.ConnectionString = "Provider=" & PROVIDER _
& ";Data Source=" & DATA_SOURCE _
& ";Initial Catalog=" & DATABASE _
& ";UID=" & USER_ID _
& ";PWD=" & PASSWORD
' オープン
adoCn.Open
Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクト
With adoRs
.Open "Test", adoCn, 1, 3 'レコードセットを開く(1:キーセットカーソル 3:レコードごとの共有的ロック)
For i = 1 To Range("A1").End(xlDown).Row
id = Cells(i, 1).Value
flg = exitCheck(id, adoCn)
' 存在しなければ insertを実行
If flg Then
.AddNew
!id = id
!Name = Cells(i, 2).Value
.Update
End If
Next i
.Close 'レコードセットのクローズ
End With
GoTo EXIT_SECTION
EXCEPTION_SECTION:
With Err
MsgBox (.Description), vbOKOnly + vbExclamation + vbSystemModal, PROCEDURE_NAME
End With
GoTo EXIT_SECTION
EXIT_SECTION:
' レコードセットのクローズ
If Not adoRs Is Nothing Then
If adoRs.State = 1 Then adoRs.Close ' 開かれていればクローズ
Set adoRs = Nothing
End If
' データベースのクローズ
If Not adoCn Is Nothing Then
If adoCn.State = 1 Then adoCn.Close ' 開かれていればクローズ
Set adoCn = Nothing
End If
MsgBox ("終了")
End Sub
Private Function exitCheck(ByVal id As Long, ByRef adoCn As Object) As Boolean
Dim strSQL As String
Dim adoRs As Object
Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクト
' 存在チェック
strSQL = "SELECT top(10) * FROM [sample].[dbo].[Test] where id =" & id
adoRs.Open strSQL, adoCn 'レコード抽出
exitCheck = adoRs.EOF ' フラグ
adoRs.Close
End Function
-
前の記事
mongoDB ドキュメント(レコード)をカウントする 2022.07.11
-
次の記事
javascript エラー「TypeError: Invalid mix of BigInt and other type in addition.」の解決方法 2022.07.11
コメントを書く