从MS Access执行存储过程导致超时

时间:2016-03-14 00:18:57

标签: sql-server tsql ms-access

最奇怪的事情。我有一个简单的过程,我在Microsoft Access 2010中使用SQL Server 2012后端开发。我现在正尝试将其部署到生产中,即Access 2016和SQL Server 2014后端。

我在新环境中编译,压缩和修复...但是我无法获得Access来执行这个简单的存储过程。更糟糕的是,它仍然可以执行其他几个存储过程...但其中有几个超时而拒绝执行?

这是我的VBA和存储过程:

 Private Sub GenerateUnitKey(UnitColumns As String)
    Dim Msg, Style, Title, Response As Variant
    Dim lngProcessID As Long
    Dim Conn As ADODB.Connection
    Dim Cmd As ADODB.Command
    Dim CurrentConnection As String

    CurrentConnection = LinkMasterConnection()

    Msg = "Are you sure you want to update the UnitKey with the selected columns?"
    Style = vbYesNo + vbCritical + vbDefaultButton2
    Title = "Save Campaign?"
    Response = MsgBox(Msg, Style, Title)

    If Response = vbYes Then
    Call OpenSixHatLoader("Generating Unit Key Across Campaign Records", 1, "")

    Set Conn = New ADODB.Connection
    Conn.Open CurrentConnection
    Set Cmd = New ADODB.Command
    With Cmd
        .ActiveConnection = CurrentConnection
        .CommandText = "usp_GenerateUnitKey"
        .CommandType = adCmdStoredProc
        .CommandTimeout = 30
        .Parameters.Append .CreateParameter("@UnitColumns", adVarChar, adParamInput, 4000, UnitColumns)
        .Execute
        End With
    End If
End Sub

存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_GenerateUnitKey]
@UnitColumns AS VARCHAR(4000)
AS      
SET NOCOUNT ON
DECLARE @SQL AS VARCHAR(MAX)
UPDATE tblStagingTable SET UnitKey =''

SET @SQL = 'UPDATE tblStagingTable SET UnitKey = ' + @UnitColumns + ' FROM tblStagingTable st'
EXEC(@SQL)

-- UPDATE Interests to match Staging Table
UPDATE tblInterests SET UnitKey = st.[UnitKey] FROM tblInterests i
INNER JOIN tblStagingTable st ON i.StagingTableID = st.StagingTableID 

我相信代码没有任何问题...因为我说它在我的开发环境中工作正常...更多我手动能够在SQL Server中执行存储过程。我的SQL Server Native Client 11.0连接可用于执行其他存储过程...但对于其中几个,它不起作用。我想我需要在SQL Server本身或可能在Native Client 11.0驱动程序中配置一些东西?

不幸的是它没有例外。我已经将CommandTimeout属性设置为0并让它突然停留几个小时,希望它会抛出异常来给我一个线索,但没什么......它只是被冻结试图执行。任何建议或想法都将非常感激,因为这个让我真的很难过,因为它应该没问题!

2 个答案:

答案 0 :(得分:3)

我首先会启动SSMS,并从SQL studio中输入 执行xxxxx''

确保它运行(并使用SAME登录和连接到当前用于Access的SSMS。

我还会考虑创建一个pass-though查询,并将该查询保存在访问中。 (如果sp不返回记录,则设置返回records = false)。然后在代码中运行任何proc,你可以去:

With CurrentDb.QueryDefs("qryPass")
  .SQL = "exec usp_GenerateUnitKey '" & UnitColumns & "'"
  .Execute
End With

你注意到上面的代码是多么简单 - 所以如果sp从SSMS运行,那么试试上面的代码。

答案 1 :(得分:0)

这是一个困难的问题,我花了大约3天的时间进行故障排除才能获得解决方案。虽然我对最终解决方案不满意,因为它本应该起作用......但最后我的服务器理论是虚拟机证明是正确的。当我在专用服务器上将此完全相同的设置部署到Microsoft Access 2016 32位和SQL Server 2014 32位时,它的工作方式与我尝试部署到的Azure VM和1& 1云服务器相比。 / p>

SQL Server与VM的集成从我所读过的内容中变得越来越好,但显然还有很长的路要走。也许SQL Server需要发布一个特殊的VM版本。感谢所有花时间研究这个问题的人。