Ошибка ASP и ADO: для одного или нескольких обязательных параметров не задано значение - PullRequest
2 голосов
/ 09 октября 2009

Язык vbscript и классический ASP.

Следующий SQL работает, когда значения жестко запрограммированы в операторе sql:

sql = "UPDATE STORE2_ITEM SET sku = 'abcd' WHERE id = 224 and host_id = 1"

То, что я пытаюсь сделать, это добавить параметры, чтобы я заменил назначение field1 следующим:

sql = "UPDATE STORE2_ITEM SET sku = ? WHERE id = 224 and host_id = 1"

(пока просто, чтобы посмотреть, смогу ли я заставить этот параметр работать).

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

"Не задано значение для одного или нескольких обязательных параметров."

Остальной код выглядит следующим образом:

Set DynaDb = Server.CreateObject("ADODB.Connection")
DynaDB.ConnectionString = STORE_CONNECTION_STRING
DynaDb.Open

sql = "UPDATE STORE2_ITEM SET sku = ? WHERE id = 224 and host_id = 1"

Set cmd = Server.CreateObject("ADODB.Command")
cmd.CommandText = sql

cmd.CommandType adCmdText
cmd.Prepared = true

cmd.Parameters.Append(cmd.CreateParameter("", 200, 1, "AbcD"))

cmd.ActiveConnection = DynaDB
cmd.Execute

Другая информация: Строка подключения: Поставщик = SQLOLEDB.1; Источник данных = xxxxxxx; Первоначальный каталог = xxxxxx; Постоянная информация о безопасности = True; ID пользователя = xxxx; Идентификатор пользователя = mkj; ПАРОЛЬ = xxxxxx;

РЕДАКТИРОВАТЬ: я удалил код, который дал мне ошибку несоответствия типов, поскольку это действительно не имеет отношения.

РЕДАКТИРОВАТЬ: я удалил свой ответ здесь и опубликовал его как «Ответ» ниже.

Ответы [ 4 ]

3 голосов
/ 09 октября 2009

Синтаксис для параметров в командной строке ADODB SQL Server:

@ParameterName

Вот пример кода:

Dim rst As ADODB.Recordset

Set cmd = New ADODB.Command

cmd.ActiveConnection = "Provider=SQLOLEDB.1;Data Source=(local);" & 
"Integrated Security=SSPI;Initial Catalog=DatabaseName"

cmd.CommandText = "DECLARE @PARAMETER1 datetime, @PARAMETER2 datetime, 
@PARAMETER3 bit;" & _
"SELECT * FROM blah, blah.... " & _
"WHERE something>= @PARAMETER3 AND " & _
"something BETWEEN @PARAMETER1 AND @PARAMETER2"

cmd.CommandType = adCmdText

Set PARAMETER1 = cmd.CreateParameter("@PARAMETER1", adDate, adParamInput)
cmd.Parameters.Append PARAMETER1
PARAMETER1.Value = "01/01/2000"

Set PARAMETER2 = cmd.CreateParameter("@PARAMETER2", adDate, adParamInput)
cmd.Parameters.Append PARAMETER2
PARAMETER2.Value = "05/01/2007"

Set PARAMETER3 = cmd.CreateParameter("@PARAMETER3", adInteger, adParamInput)
cmd.Parameters.Append PARAMETER3
PARAMETER3.Value = 0

Set rst = New ADODB.Recordset
Set rst = cmd.Execute()
1 голос
/ 10 октября 2009

Я понял это. Энтони и Роберт указали мне в правильном направлении.

Я понял, что, хотя в сообщении об ошибке говорилось, что случилось, оно мне показалось вводящим в заблуждение. Это даст мне ошибку выше, когда мой параметр не был объявлен правильно.

Основная проблема заключалась в том, что константы как-то не существовали. Поместив их целочисленные значения, я смог заставить его работать. Я думаю, что я понял это сначала, поэтому в моем первоначальном посте было "200" для adVarChar. Итак, я только что объявил эти переменные в верхней части моего asp (кстати, кто-нибудь знает, как включить эти константы?).

Кроме того, казалось, что нужен размер параметров (т. Е. 50 для adVarChar). Итак, мой окончательный код выглядел следующим образом (:

' Data Types
adInteger = 3
adVarChar = 200
adDecimal = 14

' Direction Constants
adParamInput = 1
adParamOutput = 2

On Error Resume Next
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")

conn.ConnectionString = "Provider=SQLOLEDB.1;Data Source=BRYCE-PC7\SQLEXPRESS;Initial Catalog=Funeral;Persist Security Info=True;User ID=mkj;PASSWORD=jibenear32;"
conn.Open

cmd.ActiveConnection = conn
cmd.CommandType = 1
cmd.CommandText = "UPDATE STORE2_ITEM SET sku = ? WHERE id = 224 and host_id = 1"

Set param = cmd.CreateParameter(, adVarChar, adParamInput, 50)
param.Value = "NEW SKU"

cmd.Parameters.Append param

cmd.Execute
1 голос
/ 10 октября 2009

Удалите эту строку из своего кода: -

cmd.Prepared = true

Что происходит, когда вы используете эту строку (или пытаетесь проиндексировать коллекцию параметров, прежде чем что-либо добавить к ней), это ADO-обходы сервера БД с запросом набора параметров, необходимых для выполнения команды. Следовательно, эта строка создает для вас обязательную запись параметра, но без значения.

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

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

0 голосов
/ 09 октября 2009

Другой синтаксис:

with server.createobject("adodb.command")
  .activeConnection = application("connection_string")
  .commandText "update sometable set some_col=?"
  .execute , array(value)
end with
...