2017-04-11 85 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

工作。最后一个问题。将其导出到excel或访问表。一列长度小于500,另一列长度超过10000个字符。 – Draco

+0

工作。最后一个问题。我更喜欢将数据导出到表格,如果我必须将其转储到Excel。一列长度<500字符,另一列长度为10000+字节。什么是导出数据的最佳方式? 我宁愿不必按列和行滚动记录集。 谢谢 – Draco

+1

虽然VBA/ADO可以做到这一点,但有更简单的方法。 [传递查询](https://support.microsoft.com/en-gb/help/303968/how-to-create-an-sql-pass-through-query-in-access)可以将您的SP显示为表。作为额外的奖励,他们是免费的代码。 –

相关问题