Accessからストアドを実行するVBAを作成しましたが、実際にストアドがちゃんと動いたのかどうかを確認するのに、テーブルの値を確認してみたりと大変です。
もっと簡単に
ポイント
ストアドが実行されたのかを確認する方法としてSqlserverからの戻り値からのAccess側でのメッセージと、現時点の最もシンプルなストアドの実行方法
などをまとめておきたいと思います。
サンプルVBAコード
Private Sub job_btn_Click()
Dim cn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim anser As String
On Error GoTo ERR_HANDLER
'SQLServer接続設定&接続
With cn
.Provider = "SQLOLEDB"
.ConnectionString = "Data Source=servername\SQLEXPRESS;" & _
"Initial Catalog=DB2;" & _
"User ID=user2;" & _
"Password=japan2020$$"
.Open
End With
'ストアドプロシージャの実行情報を設定
cmd.ActiveConnection = cn
cmd.CommandType = adCmdStoredProc 'コマンドの種類
cmd.CommandText = "test_calc" 'ストアドプロシージャ名
'ストアドプロシージャへの引数を設定
'入力引数
cmd.Parameters("@input_no").Value = Forms![dbo_data]![input_no]
'ストアドプロシージャの実行
cmd.Execute
'実行結果の表示
anser = cmd.Parameters("@ans").Value
' 戻り値の判断& 表示用メッセージ生成
If cmd.Parameters(0).Value = 0 Then
MsgBox anser & "出荷予定数の計算は正常終了しました。"
Else
MsgBox "異常終了しました" & vbCrLf
End If
'オブジェクトのクローズ
cn.close
'オブジェクトの開放
Set cmd = Nothing
Set cn = Nothing
Exit Sub
ERR_HANDLER:
'エラーメッセージ
MsgBox Err.Number & ")" & Err.Description
'オブジェクトの開放
Set cmd = Nothing
Set cn = Nothing
End Sub
サンプルストアドコード
USE [DB2]
GO
/****** Object: StoredProcedure [dbo].[test_calc] Script Date: 2020/08/20 14:23:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[test_calc]
@input_no int,
@ans VARCHAR(50)OUTPUT
AS
BEGIN TRY
BEGIN TRANSACTION
UPDATE dbo.[data]
SET dbo.[data].kazu = dbo.[data].kazu+1
WHERE dbo.[data].no = @input_no
SELECT @ans=dbo.[data].answer
FROM dbo.data
WHERE dbo.[data].no = @input_no
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
RETURN ERROR_NUMBER()
END CATCH
RETURN 0
実行すると戻り値のメッセージ
ストアドを実行して何の問題もなければ、Access側でメッセージを出すようにしました。
わざと、ストアドがエラーを出すように、
@input_no int,
を@input_no1 int,などの関係ない変数にしてエラーを返すようにしました。
つまり、今回のサンプルコードで、ちゃんとSqlserver上のストアドが実行されて、戻り値によりメッセージが変わることが確認することができました。
フォームでSqlServer接続設定をする
接続情報が変わったりすると、いちいちコードを編集するのが面倒だってことがあります。
ひとつテーブル(例odbc)を作成して、フォームにして簡単にODBC接続設定をするようにできるようにしました。
Private Sub job_btn_Click()
Dim cn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim anser As String
' Dim idsn As String
Dim idatabase As String
Dim iuid As String
Dim ipwd As String
Dim iserver As String
' idns = DLookup("DSN", "odbc", "ID = 1")
idatabase = DLookup("DATABASE", "odbc", "ID = 1")
iuid = DLookup("UID", "odbc", "ID = 1")
ipwd = DLookup("PWD", "odbc", "ID = 1")
iserver = DLookup("SERVER", "odbc", "ID = 1")
On Error GoTo ERR_HANDLER
'SQLServer接続設定&接続
With cn
.Provider = "SQLOLEDB"
.ConnectionString = "Data Source=" & iserver & ";" & _
"Initial Catalog=" & idatabase & ";" & _
"User ID=" & iuid & ";" & _
"Password=" & ipwd & ""
Debug.Print .ConnectionString
.Open
End With
'ストアドプロシージャの実行情報を設定
cmd.ActiveConnection = cn
cmd.CommandType = adCmdStoredProc 'コマンドの種類
cmd.CommandText = "test_calc" 'ストアドプロシージャ名
'ストアドプロシージャへの引数を設定
'入力引数
cmd.Parameters("@input_no").Value = Forms![dbo_data]![input_no]
'ストアドプロシージャの実行
cmd.Execute
'実行結果の表示
anser = cmd.Parameters("@ans").Value
' 戻り値の判断& 表示用メッセージ生成
If cmd.Parameters(0).Value = 0 Then
MsgBox anser & "出荷予定数の計算は正常終了しました。"
Else
MsgBox "異常終了しました" & vbCrLf
End If
'オブジェクトのクローズ
cn.close
'オブジェクトの開放
Set cmd = Nothing
Set cn = Nothing
Exit Sub
ERR_HANDLER:
'エラーメッセージ
MsgBox Err.Number & ")" & Err.Description
'オブジェクトの開放
Set cmd = Nothing
Set cn = Nothing
End Sub
PC設定のDSNを使わずに、サーバーに接続しているので、コメントアウトしてあります。
このコードにて実験をしてストアドがちゃんと動いてコメントを返してくれることを確認できました。