Общая цель
Переписать часть веб-сайта, открытую для давних клиентов, которая по-прежнему полагается на выполнение запроса в формате 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 в MS SQL Server, чтобы увидеть, как сервер отвечает, и я вижу:
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
Ага!Похоже, что он передает два параметров, первый параметр как по умолчанию .А?Что это такое?Как оно туда попало?
Очевидно, это вызвано слишком большим количеством параметров, но я не думаю, что мой код добавляет два параметра, только один.
Эта ошибка также появляется, когда люди по неосторожности зацикливаются, но я еще даже не дошел до зацикливания.Я планирую просмотреть цикл позже.