2017-09-07 56 views
1

ADPをACCDB(SQL Serverにリンクされたテーブル/ビュー)に変換しており、DAOパススルークエリでかなりうまくいきました。私が立ち往生している1つの領域は、ストアドプロシージャからOUTPUTパラメータを取得することです。DAOパススルークエリを使用してストアドプロシージャから出力値を取得する方法

SPは、次のパラメータ

(@IType int, @RetVal bit OUTPUT) 

を持っていると、単にレコードが返されない

IF @IType = 1 
    SET @RetVal = (SELECT ... 
. . . 

、以下の処理ロジックを話します。 Access VBAプロシージャで必要とされるのはRetValだけです。

私はウェブを検索しましたが、ソリューションはテーブルに値を書き込むか、ADODBを使用する傾向があります。

変更は複数のデータベースに伝播する必要があるため、格納されているprocを変更しないようにします。

また、既にパスを開始しているので、DAOパススルーを使用することをおすすめします。

これを達成する方法はありますか?

答えて

2

はい、匿名コードブロックを使用してOUTPUTパラメータを取得するパススルークエリを作成できます。ストアドプロシージャ

CREATE PROCEDURE [dbo].[IsOne] 
    @IType INT = 0, 
    @RetVal BIT OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    IF @IType = 1 
     SET @RetVal = 1; 
    ELSE 
     SET @RetVal = 0; 
END 

のために、あなたはこのようにVBAコードを使用することができます。

Option Compare Database 
Option Explicit 

Sub ptqTest() 
    Dim cdb As DAO.Database 
    Set cdb = CurrentDb 
    Dim ptq As DAO.QueryDef 
    Set ptq = cdb.CreateQueryDef("") ' temporary pass-through query 
    ptq.Connect = "ODBC;DSN=SQLmyDb" 
    ptq.ReturnsRecords = True 
    ptq.SQL = _ 
      "DECLARE @rv BIT;" & _ 
      "EXEC dbo.IsOne @IType = 3, @RetVal = @rv OUTPUT;" & _ 
      "SELECT @rv;" 
    Dim rs As DAO.Recordset 
    Set rs = ptq.OpenRecordset 
    ' BIT value 0 will map to False in this case 
    Debug.Print "stored procedure returned " & rs(0) 
    rs.Close 
    Set rs = Nothing 
    Set ptq = Nothing 
    Set cdb = Nothing 
End Sub 
+0

これは絶対にトリックをしました!私は、レコードセットを返すどのような解決策にも目立たなかったと思います。今私は、SPに触れることなくオン・リクエスト・レコードセットを作成することに気付きました。非常に賢い。私は非常に迅速な応答と簡潔な例を感謝します。 – UhClem

+1

私は、ウェブ上で少なくとも2つの場所が見つかったと認めますが、DAOではこれができないと主張されていました。本当ではない、人々! – UhClem

関連する問題