从 MSAccess 调用存储过程失败,但 运行 来自 Sql 服务器管理器的完全相同的命令有效
Calling Stored Procedure from MSAccess fails, but running the exact same command from Sql Server Manager works
我有一个 Access 数据库,其中有一堆来自 SQL 服务器数据库的链接表。 Access 数据库调用 SQL 服务器数据库上的存储过程来更新表单上的数据。
Dim sql As String
Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
cnn.ConnectionString = "DSN=Records"
cnn.CommandTimeout = 90
cnn.Open
sql = "exec myStoredProcedure @param1=" & Me.txtParam1Field & ", @param2=" & Me.txtParam2Field
cnn.Execute sql
Set cnn = Nothing
frmMyForm.Requery
当我 运行 这样做时,如果 CommandTimeout 值不够长,它要么超时,要么执行,但由于某种原因实际上没有执行 myStoredProcedure
。如果我将字符串 sql 传递到 Sql 服务器管理器中,myStoredProcedure 会在不到一秒的时间内执行并且一切正常。
我已经尝试在 Access 中调试这段代码,但是当我跨过 cnn.Execute sql
.
时没有得到任何有用的结果
您可以尝试将命令对象上的 Prepared 属性 设置为 false。这会导致在执行之前重新编译过程,但可能会根据发送的参数生成更好的计划。
Dim sql As String
Dim cnn As ADODB.Connection
Dim Cmd As ADODB.Command
Set cnn = New ADODB.Connection
cnn.ConnectionString = "DSN=Records"
cnn.CommandTimeout = 90
cnn.Open
sql = "exec myStoredProcedure @param1=" & Me.txtParam1Field & ", @param2=" & Me.txtParam2Field
Set Cmd = New ADODB.Command
Set Cmd.ActiveConnection = cnn
Cmd.CommandType = adCmdText
Cmd.CommandText = sql
Cmd.Prepared = False
Cmd.CommandTimeout = 300
Cmd.Execute
根据 txtParam1Field 和 txtParam2Field 的值,您可能希望用单引号将值括起来,如下所示:
sql = "exec myStoredProcedure @param1='" & Me.txtParam1Field & "', @param2='" & Me.txtParam2Field & "'"
如果我们采用您的原始代码并假设 txtParam1Field 等于 1 并且 txtParam2Field 等于 John,那么您生成的 sql 将不会执行,因为它看起来像这样:
exec myStoredProcedure @param1=1, @param2=John
最好的办法是在调试 window 中输出 "sql" 变量的值,并在 sql 查询管理器中输出 运行 确切的语句。如果格式不正确,那将准确地告诉您问题出在哪里 SQL.
我有一个 Access 数据库,其中有一堆来自 SQL 服务器数据库的链接表。 Access 数据库调用 SQL 服务器数据库上的存储过程来更新表单上的数据。
Dim sql As String
Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
cnn.ConnectionString = "DSN=Records"
cnn.CommandTimeout = 90
cnn.Open
sql = "exec myStoredProcedure @param1=" & Me.txtParam1Field & ", @param2=" & Me.txtParam2Field
cnn.Execute sql
Set cnn = Nothing
frmMyForm.Requery
当我 运行 这样做时,如果 CommandTimeout 值不够长,它要么超时,要么执行,但由于某种原因实际上没有执行 myStoredProcedure
。如果我将字符串 sql 传递到 Sql 服务器管理器中,myStoredProcedure 会在不到一秒的时间内执行并且一切正常。
我已经尝试在 Access 中调试这段代码,但是当我跨过 cnn.Execute sql
.
您可以尝试将命令对象上的 Prepared 属性 设置为 false。这会导致在执行之前重新编译过程,但可能会根据发送的参数生成更好的计划。
Dim sql As String
Dim cnn As ADODB.Connection
Dim Cmd As ADODB.Command
Set cnn = New ADODB.Connection
cnn.ConnectionString = "DSN=Records"
cnn.CommandTimeout = 90
cnn.Open
sql = "exec myStoredProcedure @param1=" & Me.txtParam1Field & ", @param2=" & Me.txtParam2Field
Set Cmd = New ADODB.Command
Set Cmd.ActiveConnection = cnn
Cmd.CommandType = adCmdText
Cmd.CommandText = sql
Cmd.Prepared = False
Cmd.CommandTimeout = 300
Cmd.Execute
根据 txtParam1Field 和 txtParam2Field 的值,您可能希望用单引号将值括起来,如下所示:
sql = "exec myStoredProcedure @param1='" & Me.txtParam1Field & "', @param2='" & Me.txtParam2Field & "'"
如果我们采用您的原始代码并假设 txtParam1Field 等于 1 并且 txtParam2Field 等于 John,那么您生成的 sql 将不会执行,因为它看起来像这样:
exec myStoredProcedure @param1=1, @param2=John
最好的办法是在调试 window 中输出 "sql" 变量的值,并在 sql 查询管理器中输出 运行 确切的语句。如果格式不正确,那将准确地告诉您问题出在哪里 SQL.