【问题标题】:SQL Server return table to MS Access via stored procedureSQL Server 通过存储过程将表返回给 MS Access
【发布时间】:2017-09-06 23:38:35
【问题描述】:

我正在尝试将一个包含 50 多列的表返回给 MS Access,并且行可以从 0 到 5000 不等。对于每种情况,都可以有多个记录和车辆类型。

我可以执行存储过程,它工作正常。我无法让数据返回 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

【问题讨论】:

  • 你遇到了什么麻烦?代码是否返回错误消息,或者您不确定如何访问记录?如果是后者,您需要ADO recordset
  • 没有返回任何内容,也没有错误消息。不知道如何通过 ADO 访问记录
  • 查看 ExecuteReader() msdn.microsoft.com/en-us/library/…
  • 对不起@pmbAustin,那是 ADO.Net。这是classic ADO,不支持。

标签: sql-server vba ms-access stored-procedures ms-access-2010


【解决方案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。我发现按名称而不是位置来引用字段更容易。

【讨论】:

  • 行得通。最后一个问题。将其导出到 Excel 或访问表。一列的长度
  • 行得通。最后一个问题。如果必须将数据转储到 excel 中,我更喜欢将数据导出到表中。一列的长度
  • 虽然 VBA/ADO 可以做到这一点,但还有更简单的方法。 Pass through queries 可以将您的 SP 显示为表格。作为额外的奖励,它们是免费的。
猜你喜欢
  • 2013-09-18
  • 2015-06-18
  • 2019-03-06
  • 2014-05-22
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多