分かりやすく、使いやすく。

プリペアドステートメントで SQLを実行する方法

スポンサーリンク

Excel VBA から SQL Server 上で SQL を実行する際に、プリペアドステートメントを使用するサンプルコードです。

  1. SQL Server側のストアドプロシージャ
  2. VBA のサンプルコード


SQL Server側のストアドプロシージャ

事前に SQL Server に以下のテーブルを作成しておきます。

sql(実行可能なサンプルコード)
1
2
3
4
5
CREATE TABLE [dbo].[TEST_TABLE]
(
    [ID] [INT] NULL,
    [MEMO] [VARCHAR](10) NULL
); 

VBA のサンプルコード

上記のストアドプロシージャに引数を渡して実行する Excel VBA のサンプルコードは次の通りです。

このコードを実行するには、事前にADODBへの参照設定が必要です。

(参考)ExcelでADODBの参照設定を行う方法

VBA(実行可能なサンプルコード)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Option Explicit
 
Sub test()
    '■接続先情報を設定
    'この例では、ローカルのインスタンス「SQLEXPRESS」にWindows認証で接続する。
    Dim connectionString As String
    
    Dim dataSourceName As String
    Dim databaseName As String
    
    '「.」はローカルを表す。他のサーバに接続する場合はホスト名を指定。
    dataSourceName = ".\SQLEXPRESS" '
    
     'TESTデータベースに接続する。
    databaseName = "TEST"
    
    'ODBC接続の接続文字列を作成する。
    connectionString = ""
    connectionString = connectionString & "PROVIDER=MSDASQL;"
    connectionString = connectionString & "DRIVER={SQL Server};"
    connectionString = connectionString & "SERVER=" & dataSourceName & ";"
    connectionString = connectionString & "INITIAL CATALOG=" & databaseName & ";"
    connectionString = connectionString & "Trusted_connection=yes; "
    
    '■接続
    Dim objConnection As ADODB.Connection
    
    Set objConnection = New ADODB.Connection
    
    objConnection.CursorLocation = adUseClient
    objConnection.Open connectionString
    
    '■実行するSQLを設定
    Dim objCommand As ADODB.Command
    Set objCommand = New ADODB.Command
    
    Dim sql As String
    
    ' プリペアドステートメントを定義
    sql = ""
    sql = sql & " INSERT INTO TEST.dbo.TEST_TABLE"
    sql = sql & " (ID, MEMO) VALUES (?, ?);"
    
    Set objCommand.ActiveConnection = objConnection
    
    objCommand.CommandType = adCmdText
    objCommand.CommandText = sql
    
        ' 1個目の ? に「52」を設定
    Call objCommand.Parameters.Append( _
        objCommand.CreateParameter("ID", adInteger, adParamInput, , 52) _
    )
        
        ' 2個目の ? に「B'z」を設定
    Call objCommand.Parameters.Append( _
        objCommand.CreateParameter("MEMO", adChar, adParamInput, 10, "B'z") _
    )
    
    '■登録件数を受け取る変数を準備
    Dim affectedRowNum As Long
    
    '■SQLを実行
    objCommand.Execute affectedRowNum
    
    '■登録件数を表示
    Debug.Print "登録された件数→" & affectedRowNum
    
    '■終了処理
    Set objCommand = Nothing
    Set objConnection = Nothing
End Sub 

実行後に TEST.dbo.TEST_TABLE の中身を参照すると、引数で渡した値が登録されています。

スポンサーリンク
スポンサーリンク