Параметры 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 для adCmdStoredProcCommandTypeEnum как .CommmandText будет изменен на формат {call AddUser (?,?)}, разница в том, что вы не можете использовать эту форму самостоятельно, если вы не укажете .CommandType = adCmdText, Там нет никаких дополнительных преимуществ использования любого из них, но на мой взгляд adCmdStoredProc просто упрощает звонки и прячет от вас гайки и болты.

Код не работает, потому что у меня есть эти неверные:

cmd.CommandType = adCmdStoredProc

Удаление его, работает.

Другие вопросы по тегам