Параметры ASP для вызова хранимой процедуры в SQL Server
Я пытаюсь вызвать эту хранимую процедуру в SQL Server, который вставляет данные.
У меня есть это:
CREATE PROCEDURE [dbo].[AddUser]
@user_id bigint,
@user_name varchar(20)
AS
BEGIN
INSERT INTO [users] ([id], [name])
VALUES (@user_id, @user_name)
END
и у меня есть этот код ASP:
<%
Const adCmdStoredProc = 4
Const adBigInt = 20
Const adParamInput = 1
Const adVarChar = 200
Set conn = Server.CreateObject("ADODB.Connection")
connectionstring = "Provider=SQLOLEDB.1;Password=***********;Persist Security Info=True;User ID=sa;Initial Catalog=Test;Data Source=AREAWEB2-PC"
conn.Open connectionstring
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "{call AddUser (?,?)}"
frm_id = 1
frm_name = "Carlos"
Set prmUserId = cmd.CreateParameter("@user_id", adBigInt, adParamInput, 0, frm_id)
Set prmUserName = cmd.CreateParameter("@user_name", adVarChar, adParamInput, 20, frm_name)
Cmd.Parameters.Append prmUserId
Cmd.Parameters.Append prmUserName
Set rs = cmd.Execute
%>
Но я получаю это сообщение об ошибке:
Поставщик Microsoft OLE DB для SQL Server, ошибка "80040e10"
Что случилось?
2 ответа
Если вы гуглите код ошибки 80040e10
быстро становится очевидным, что проблема связана с определениями параметров;
Почему я получаю ошибки 80040E10?
Поставщик Microsoft OLE DB для SQL Server, ошибка "80040e10" Процедура '' ожидает параметр '', которая не была предоставлена.
Ваша проблема, вероятно, из-за прохождения 0
размер в вашем @user_id
параметр, так как все параметры должны передавать максимальный размер либо с помощью .CreateParameter()
или перед добавлением параметра в коллекцию с помощью .Size
имущество.
Обновить:
Как указала ФП, проблема на самом деле связана с
CommandType
значение свойства устанавливается.Думал, что стоит расширить ответ, чтобы объяснить, почему. Причина в том, что
CommandType
в примере ОП установленоadCmdStoredProc
но.CommandText
для свойства не задано имя хранимой процедуры, самый простой способ исправить это (вместо удаления.CommandType
) это изменить.CommandText
следующее;cmd.CommandText = "AddUser"
Другой вариант - изменить
.CommandType
вadCmdText
который примет формат{call AddUser (?,?)}
,cmd.CommandType = adCmdText
Внутренне ADO использует
adCmdText
дляadCmdStoredProc
CommandTypeEnum
как.CommmandText
будет изменен на формат{call AddUser (?,?)}
, разница в том, что вы не можете использовать эту форму самостоятельно, если вы не укажете.CommandType = adCmdText
, Там нет никаких дополнительных преимуществ использования любого из них, но на мой взглядadCmdStoredProc
просто упрощает звонки и прячет от вас гайки и болты.
Код не работает, потому что у меня есть эти неверные:
cmd.CommandType = adCmdStoredProc
Удаление его, работает.