Excel VBA + ADO ストアドからレコードセット取得,シートへ貼付

Dim Cn As ADODB.Connection
Dim rst As New ADODB.Recordset


1.ストアドからレコードセットを取得して返す

Sub Test1(ByRef rst As ADODB.Recordset)
  Cn.stTest1 rst ‘ストアド実行
End Sub


2.ストアドからレコードセットを取得して返す(パラメーターあり)

Sub Test2(a1 AS Long, Date1 As Date, Str1 As String, ByRef rst As ADODB.Recordset)
    Dim cmd As ADODB.Command
    Dim par0 As ADODB.Parameter, par1 As ADODB.Parameter, par2 As ADODB.Parameter
    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = Cn
    cmd.CommandText = “stTest2”
    cmd.CommandType = adCmdStoredProc
    cmd.CommandTimeout = 30 ‘タイムアウト時間
    ‘パラメーター設定
    Set par0 = cmd.CreateParameter(“@a1”, adInteger, adParamInput) ‘int
    cmd.Parameters.Append par0
    par0.Value = a1
    Set par1 = cmd.CreateParameter(“@Date1”, adDBDate, adParamInput) ‘datetime
    cmd.Parameters.Append par1
    par1.Value = Date1
    Set par2 = cmd.CreateParameter(“@Str1”, adVarWChar, adParamInput, 50) ‘nvarchar(50)
    cmd.Parameters.Append par2
    par2.Value = Str1
    ‘実行
    rst.Open cmd, , adOpenForwardOnly, adLockReadOnly
    Set cmd = Nothing
End Sub


3.シートへの貼付

レコードセットの内容をそのままシートに貼り付けるにはCopyFromRecordsetメソッド
Sheet1.Cells(1, 1).CopyFromRecordset rst

普通は↑のようにそのまま貼り付けても役に立たないので配列に加工してから貼付
Dim DataArray() As Variant ‘2次元配列にする
‘レコードセットを配列に代入して加工するコード
・・・
‘配列をシートに貼付
Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(UBound(DataArray, 1) + 1, UBound(DataArray, 2) + 1)).Value = DataArray


注意: VBAではレコードセットをReadOnlyで開いてもなぜかロックがかかってしまうことがあるので,レコードセットはできるだけ早く閉じた方がいい.

SQL Server タイムアウト関連の設定

1. 接続のタイムアウト ADO
  SqlConnection.ConnectionTimeout プロパティー (ADO.Net)
  規定値15秒
  0は制限無し.

  このプロパティーはReadOnlyなので設定はできない.
  設定はConnectionStringで接続時におこなう.

  例:
  ConnectionString = “Data Source=(local);Database=test;Integrated Security=SSPI;Connection Timeout=30;”

参考:
SqlConnection.ConnectionString プロパティ (MSDN)

  このConnectionTimeoutは接続のタイムアウトなので,コマンド実行のタイムアウトとは関係ない.
コマンド実行のタイムアウトは↓.


2. クエリー(コマンド実行)のタイムアウト ADO
  SqlCommand.CommandTimeout プロパティー (ADO.Net)
  規定値30秒
  0は制限無し.

  例:
  cmd.CommandTimeout = 60

  Excel VBAでは,ADODB.CommandのCommandTimeoutプロパティー


3. SQL Server Management Studio でテーブルのデザインを変更したときのタイムアウト
  [ツール]-[オプション]-[デザイナ]-[テーブルおよびデーターベースデザイナ]-[トランザクションがタイムアウトするまでの時間] で設定する.
  規定値30秒

参考:
http://support.microsoft.com/kb/915849/ja