Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2010)
SQLServerのストアドプロシージャの実行について
投稿日時: 18/11/07 12:24:42
投稿者: TI

こんにちは。
 
エクセルVBAからSQLServerのストアドプロシージャを実行し、その結果をRecordsetに
取り込みたいと思っています。
 
そこで以下のように記述をしたのですが、エラーは出ないのですが、
Recordsetに結果を取得できません。
SQLServerManagementStudioにて、直接ストアドプロシージャを実行すると
結果はかえってきます。
 
いろいろ調べたのですが、何が原因かわからず手詰まりの状態です。
どうか、アドバイスをお願いします。
 
Private Function ChangeBusyoNameToBusyoCode(BusyoName As String _
                                            , D As Date) As Integer
Dim par As New ADODB.Parameter
Dim DBName As String
Dim ServerName As String
 
    DBName = Sheets("設定").Range("B1").Value
    ServerName = Sheets("設定").Range("B2").Value
     
    Set Cn = Con_Open_SQLServer(DBName, ServerName)
 
Dim Cmd As New ADODB.Command
 
' Set Cmd.ActiveConnection = Cn
     
' MsgBox Cn.State
    With Cmd
        .ActiveConnection = Cn
        .CommandType = adCmdStoredProc
        .CommandText = "s_s_busyocode_from_name"
    End With
     
Dim parBusyo As New ADODB.Parameter
Dim parDate As New ADODB.Parameter
 
    Set parBusyo = Cmd.CreateParameter("@busyo", adVarChar, adParamInput, 30)
    Set parDate = Cmd.CreateParameter("@date", adDBDate, adParamInput)
     
    Cmd.Parameters.Append parBusyo
    Cmd.Parameters.Append parDate
     
    parBusyo.Value = BusyoName
    parDate.Value = CDate(D)
     
Dim rst As New ADODB.Recordset
 
    Set rst = Cmd.Execute
    'rst.Open Cmd, , adOpenForwardOnly, adLockOptimistic
     
    
    'Cmd.Execute rst
 
    If Not rst Is Nothing Then
         
        If rst.RecordCount > 0 Then
            MsgBox CStr(rst(0)("mbso_code").Value)
             
            ChangeBusyoNameToBusyoCode = rst(0)("mbso_code").Value
        Else
            MsgBox "部署コードに変換できませんでした。", vbCritical
             
            ChangeBusyoNameToBusyoCode = 0
        End If
         
         
    End If
     
    rst.Close
    Set rst = Nothing
     
  
ストアドプロシージャは以下の通りです。
ALTER PROCEDURE [dbo].[s_s_busyocode_from_name](
    @busyo varchar(30),
    @date date
)
 
AS
 
SELECT
    mbso_code
FROM
    mt_busyo
WHERE
    mbso_shortname = @busyo
AND
    mbso_startdate <= @date
AND
        (mbso_enddate IS NULL
    OR
        mbso_enddate >= @date)

回答
投稿日時: 18/11/07 15:47:39
投稿者: sk

引用:
Dim rst As New ADODB.Recordset

引用:
MsgBox CStr(rst(0)("mbso_code").Value)
 
ChangeBusyoNameToBusyoCode = rst(0)("mbso_code").Value

MsgBox CStr(rst("mbso_code").Value)
 
ChangeBusyoNameToBusyoCode = rst("mbso_code").Value
 
引用:
そこで以下のように記述をしたのですが、エラーは出ないのですが、
Recordsetに結果を取得できません。

引用:
If rst.RecordCount > 0 Then

恐らく RecordCount プロパティが -1 を返しているからでは。
 
引用:
Set Cn = Con_Open_SQLServer(DBName, ServerName)

例えば ADODB.Connection オブジェクトの CursorLocation プロパティに
定数 adUseServer を渡されているのではないでしょうか。
 
いずれにせよ、レコードの有無は RecordCount プロパティではなく
EOF プロパティの値で判別された方が無難だと思います。

投稿日時: 18/11/08 19:52:02
投稿者: TI

ご回答ありがとうございます。
 
アドバイスを頂いた部分を修正したところ、無事求める結果を得ることが
出来ました。
 
本当にありがとうございます。