Общая цель
Перепишите часть веб-сайта, доступную для давних клиентов, которая по-прежнему зависит от выполнения SQL-запроса формата и в настоящее время работает должным образом:
SQLQuery = "exec spNewPayments " & "162611"
Set rsPmts = objConnection.Execute(SQLQuery)
Где 162611 — целое число. Затем цель состоит в том, чтобы параметризовать запрос с помощью объекта command и добавить параметры, используя метод .Parameters.Append .CreateParameter.
Кроме того, вторичная цель состоит в том, чтобы в конечном итоге добавить дополнительные параметры, чтобы ограничить область запроса, но я даже не зашел так далеко в этом посте.
Проблема
При выполнении запроса с использованием objConnection.Execute хранимая процедура выполняется, как и ожидалось, с одним параметром, целым числом (см. выше). При выполнении запроса с помощью команды recordsource.Open я получаю сообщение:
spNewPayments has too many arguments specified
Code: 80040E14
Хранимая процедура создается с использованием:
USE [maindb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE PROCEDURE [dbo].[spNewPayments] @claim_id int = NULL AS
select *
FROM dbo.objectTest co
WHERE co.foreign_id = @claim_id;
GO
VBScript, который я сейчас использую в качестве теста:
Dim strCnxn
strCnxn = "DSN=myDSN"
Dim objConnection
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Mode = acModeRead
objConnection.Open strCnxn
Dim cmd
Set cmd = CreateObject("ADODB.Command")
Dim rsPmts
Set rsPmts = CreateObject("ADODB.Recordset")
With cmd
.ActiveConnection = objConnection
.CommandType = 4
.CommandText = "spNewPayments"
.Parameters.Refresh
.Parameters.Append .CreateParameter("@claim_id", 3, , , 162611)
End With
rsPmts.Open cmd
rsPmts.Close
Set rsPmts = Nothing
Set objConnection = Nothing
Set cmd = Nothing
Как уже упоминалось, когда я запускаю это, я получаю: «Процедура или функция spNewPayments имеет слишком много аргументов». Это происходит в строке rsPmts.Open cmd
Я отслеживаю с помощью Profiler в SQL Server MS, чтобы увидеть, как сервер отвечает, и я вижу:
declare @p1 int
set @p1=180150003
declare @p3 int
set @p3=8
declare @p4 int
set @p4=1
declare @p5 int
set @p5=2
exec sp_ddopen @p1 output,N'sp_sproc_columns',@p3 output,@p4 output,@p5 output,N'spNewPayments',NULL,NULL,NULL
select @p1, @p3, @p4, @p5
go
exec sp_cursorfetch 180150003,2,1,1
go
exec sp_cursorfetch 180150003,2,1,1
go
exec sp_cursorfetch 180150003,2,1,1
go
exec sp_cursorclose 180150003
go
exec spNewPayments default,162611
go
Ага! Похоже, он передает два параметра, первый параметр по умолчанию. Хм? Что это такое? Как он туда попадает?
Очевидно, это вызвано слишком большим количеством параметров, но я не думаю, что мой код добавляет два параметра, а только один.
Эта ошибка также появляется, когда люди непреднамеренно попадают в цикл, но я еще даже не добрался до своего цикла. Я планирую просмотреть recordsource позже.