2017-04-11 10 views
1

私は50以上の列を持つMS Accessにテーブルを返そうとしており、行は0から5000まで変化する可能性があります。タイプ。SQL Serverストアドプロシージャを介してMS Accessにテーブルを返す

私はストアドプロシージャを実行でき、正常に動作します。データをMS Accessに戻すのに問題があります。

ストアドプロシージャコード:

ALTER PROCEDURE [dbo].[pJDB_Export] 
    (@dteFrom int, 
    @dteTo int, 
    @Veh nvarchar(80)) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @stWhere VARCHAR(200) 

    SELECT DISTINCT [Case] 
    INTO #tmp 
    FROM data 
    WHERE [VEHICLE TYPE] = @Veh 
     AND (CY BETWEEN @dteFrom AND @dteTo) 

    SELECT DISTINCT * 
    FROM dbo.vdata_Export_V3_3_2 v 
    INNER JOIN #tmp t ON v.[CASE] = t.[CASE] 

MSアクセスコード:

Function Exec_pJDB_export(sqlConn as string) 
    Dim conn As ADODB.Connection 
    Dim cmd As ADODB.Command 

    Dim iFrom, iTo As Integer 
    Dim stv As String 
    iFrom = 1999 
    iTo = 2002 
    stv = "1 TO 2 TON TRUCKS (COMMERCIAL)" 
    Set conn = New ADODB.Connection 

    conn.Open "DSN=Cars" 
    conn.ConnectionString = sqlConn 
    Set cmd = New ADODB.Command 
    cmd.ActiveConnection = conn 
    cmd.CommandType = adCmdStoredProc 
    cmd.CommandText = "pJDB_export" 

    cmd.Parameters.Append cmd.CreateParameter("@dteFrom", adInteger, adParamInput, , iFrom) 
    cmd.Parameters.Append cmd.CreateParameter("@dteTo", adInteger, adParamInput, , iTo) 
    cmd.Parameters.Append cmd.CreateParameter("@vehicle", adVarChar, adParamInput, 80, stv) 

    cmd.Execute 
    conn.Close 

End Function 
+3

あなたは何の問題がありますか?コードがエラーメッセージを返すか、レコードにアクセスする方法がわからないのですか?後者の場合は、[ADOレコードセット](https://www.w3schools.com/asp/ado_ref_recordset.asp)が必要です。 –

+0

何も返されず、エラーメッセージも表示されません。 ADO経由でレコードにアクセスする方法がわからない – Draco

+0

ExecuteReader()をチェックアウト https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executereader(v=vs.110).aspx – pmbAustin

答えて

1

execute method戻るrecordset object。あなたのレコードを含むのはこのオブジェクトです。次に例を示します。

Function Exec_pJDB_export(sqlConn As String) 
    Dim conn As ADODB.Connection 
    Dim cmd As ADODB.Command 
    Dim rs As ADODB.Recordset    ' ADO recordset object, for accessing records. 

    Dim iFrom, iTo As Integer 
    Dim stv As String 
    iFrom = 1999 
    iTo = 2002 
    stv = "1 TO 2 TON TRUCKS (COMMERCIAL)" 
    Set conn = New ADODB.Connection 

    conn.Open "DSN=Cars" 
    conn.ConnectionString = sqlConn 
    Set cmd = New ADODB.Command 
    cmd.ActiveConnection = conn 
    cmd.CommandType = adCmdStoredProc 
    cmd.CommandText = "pJDB_export" 

    cmd.Parameters.Append cmd.CreateParameter("@dteFrom", adInteger, adParamInput, , iFrom) 
    cmd.Parameters.Append cmd.CreateParameter("@dteTo", adInteger, adParamInput, , iTo) 
    cmd.Parameters.Append cmd.CreateParameter("@vehicle", adVarChar, adParamInput, 80, stv) 

    ' This line has changed. 
    Set rs = cmd.Execute() 


    ' Loops over the records. 
    Do Until rs.EOF 

     ' Display the contents of column one to the user. 
     MsgBox rs.Fields(0).Value 

     rs.MoveNext 
    Loop 



    rs.Close 
    conn.Close 
End Function 

クイック概要:

  1. ファイルの終わりを意味EOF。あなたがすべてのレコードを見たときは本当です。
  2. MoveNextに電話することを忘れないでください。そうでないとdoループは永遠に続きます。

rs.Fields(0).Valueは、ご希望の場合はrs.Fields("YourFieldName").Valueに変更できます。私は位置ではなく名前でフィールドを参照する方が簡単だと分かります。

+0

が動作します。 1つの最後の質問。それをエクセルまたはアクセステーブルにエクスポートします。 1つの列の長さは<500で、別の列の長さは10,000 +文字です。 – Draco

+0

が動作します。 1つの最後の質問。私はテーブルにデータをエクスポートすることをお勧めします。 1つの列の長さは<500文字で、別の列は10,000文字以上です。データをエクスポートする最良の方法は何ですか? 私は、レコードセットを列と行でスクロールする必要はありません。 ありがとうございます – Draco

+1

VBA/ADOはこれを行うことができますが、より簡単な方法があります。 [クエリをパススルー](https://support.microsoft.com/en-gb/help/303968/how-to-create-an-sql-pass-through-query-in-access)では、SPを表。追加ボーナスとして、コードフリーです。 –

関連する問題