Классическая вставка asp с использованием хранимого процесса SQL Server 2008 говорит, что у меня слишком много параметров, или параметр не указан - PullRequest
1 голос
/ 14 января 2012

Прошло много времени с тех пор, как я выполнил какую-нибудь классическую работу с жерехами, но недавно меня попросили выбрать проект, над которым работал кто-то другой, который был беспорядочным.

На сайте есть база данных SQL Server 2008, и мне нужно добавить запись и извлечь столбец автоматической идентификации в качестве параметра out.

Мой код asp показан здесь ...

Call fncOpenData()
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = oConn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "usp_ins_MyRecord"
cmd.Parameters.Refresh
cmd.Parameters.Append cmd.CreateParameter("@MyValue", adVarChar, adParamInput, 10)
cmd.Parameters("@MyValue") = Request.Form("MyValue")
cmd.Execute

и моя хранимая процедура была создана с кодом здесь ...

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE usp_ins_MyRecord
    @MyValue    varchar(10)
AS
BEGIN
    INSERT INTO [MyRecords]
    (
        [MyValue]
    )
    VALUES
    (
        @MyValue
    )
END
GO

Теперь, когда я запускаю свою страницу asp, я получаю следующую ошибку ...

"Поставщик Microsoft OLE DB для драйверов ODBC '80040e14'

[Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Процедура или функция У usp_ins_MyRecord слишком много аргументов.

/ MyPage.asp, line ... "

Если я уберу строку

cmd.Parameters.Refresh

Я получаю следующую ошибку ...

"Поставщик Microsoft OLE DB для драйверов ODBC '80040e14'

[Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Процедура или функция «usp_ins_MyRecord» ожидает параметр «@MyValue», который не был в комплект поставки.

/ MyPage.asp, line ... "

Хм, да это было?!

Если я изменю свой код любым другим способом, добавив параметр, например

cmd.Parameters.Append cmd.CreateParameter("@MyValue", adVarChar, adParamInput, 10, Request.Form("MyValue")

или

myValue = Request.Form("MyValue")
Set param = cmd.CreateParameter("@MyValue", advarchar, adParamInput, 10)
cmd.Parameters.Append param
param.Value = myValue

Я получаю ту же ошибку, что и раньше, заявляя, что параметр не указан?

Я знаю, что технология устарела, и я действительно хотел бы использовать .Net, но это то, что я должен использовать, но я вырываю свои волосы здесь и не добираюсь быстро.

Может кто-нибудь увидеть, что не так, или объяснить, почему у меня возникают проблемы при получении ASP для использования хранимых процедур SQL Server 2008?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 14 января 2012

Метод Refresh из коллекции ADODB Parameters автоматически добавляет параметры из хранимой процедуры в вашу команду.

Либо используйте Обновить, либо добавьте параметры отдельно, используя CreateParameter.

Если поставщик разрешит, вы можете заполнить коллекцию параметров с помощью метода Refresh. Фактически, если вы попытаетесь получить доступ к этой коллекции, когда она пуста или до того, как вы впервые вызвали функцию «Обновить», ADO автоматически вызовет функцию «Обновить» для заполнения коллекции. Более эффективно предоставлять параметры, а не вызывать и получать эту информацию от поставщика. (Все, что вы можете сделать, чтобы уменьшить количество вызовов к провайдеру, повысит производительность.) Вы можете добавлять объекты Parameter с помощью свойства Append.

Ref: http://www.devguru.com/technologies/ado/quickref/command_parameterscollection.html

UPDATE

Вы также можете попытаться удалить знак @ при создании параметра.

cmd.Parameters.Append cmd.CreateParameter("MyValue", adVarChar, adParamInput, 10, Request.Form("MyValue"))
1 голос
/ 20 ноября 2012

Я был в идентичной ситуации почти во всех отношениях ... включая то, почему я работал с Classic ASP и переключение между сообщениями об ошибках. Принятый ответ был полезен при принятии решения не использовать «cmd.Parameters.Refresh»

Хорошо, так почему я получаю ошибку «Ожидаемый параметр», когда она явно была там? В моем случае ... в строке, где я создавал параметр, отсутствовала часть для вызова CreateParameter:

У меня было:

cmd.Parameters.Append cmd.CreateParameter ("@ PoNum", 3, 1, PONum) 'adInteger = 3, adInputParam = 1

Неправильно я думал, что мне не нужно указывать размер для целого числа. Кажется, работает нулевой размер ... Так что все стало работать правильно, когда я положил ноль для размера.

cmd.Parameters.Append cmd.CreateParameter ("@ PoNum", 3, 1, 0, PONum) 'adInteger = 3, adInputParam = 1

Извините, я не использовал константы adxxxxx ... Я унаследовал некоторый код здесь, и я не мог легко преобразовать в использование этих констант ... потому что во всем коде некоторые из этих необходимых констант использовались в качестве переменных. Я не могу дождаться, чтобы вернуться в DotNet.

0 голосов
/ 17 января 2012

Попробуйте более простой способ выполнения хранимой процедуры в классическом коде asp, используя ADODB.Connection, а не ADODB.Command ...

Set con = Server.CreateObject( "ADODB.Connection" )
con.Open oConn

sql = "exec usp_ins_MyRecord @myValue='" & somevalue & "'"
Set RS = con.execute(sql)

Затем добавьте строку в хранимую процедуру, чтобы получить идентичность недавно добавленной записи

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE usp_ins_MyRecord
    @MyValue    varchar(10)
AS
BEGIN
    INSERT INTO [MyRecords]
    (
        [MyValue]
    )
    VALUES
    (
        @MyValue
    )

SELECT @@identity AS recordid
END
GO

Затем вы можете извлечь это из набора записей

IF NOT RS.EOF THEN
  myRecordid = RS("recordid")
END IF
...