Ответ 1
Попробуйте убедиться, что тип команды установлен в хранимую процедуру.
mycommand.CommandType = System.Data.CommandType.StoredProcedure;
У меня есть хранимая процедура с параметром UserName и в моем коде позади у меня есть объект SqlCommand, который я добавляю к параметрам с помощью метода Add. Но по какой-то причине, когда объект команды пытается запустить метод ExecuteReader, он выдает исключение. Я полностью в недоумении и понятия не имею, почему он не распознает параметр. Перед запуском метода ExecuteReader у меня есть точка прерывания, поэтому я могу подтвердить, что объект команды содержит заданные параметры, что верно. Я знаю, что хранимая процедура возвращает правильные данные, когда параметры не добавляются в объект команды, но жестко закодированы в фактической хранимой процедуре. Ниже приведено сообщение об исключении, которое указано в блоке catch. Я также вставлю свой код и первую часть хранимой процедуры. Я был бы очень признателен за любую помощь в этом вопросе, поскольку я пробовал много разных подходов безрезультатно. Спасибо заранее.
Процедура или функция 'someStoredProcedure' ожидает параметр '@UserName', который не был указан.
private DataTable GetLossMitData(string code, DateTime? start, DateTime? end)
{
DataTable results = new DataTable();
string connectionString = ConfigurationManager.ConnectionStrings["asdf"].ConnectionString;
string userName = String.Empty;
try
{
using (SPSite site = new SPSite(ConfigurationManager.AppSettings["someName"]))
{
using (SPWeb web = site.OpenWeb())
{
userName = web.CurrentUser.Email.ToString();
}
}
using (SqlConnection connection1 = new SqlConnection(connectionString))
{
connection1.Open();
using (SqlCommand command1 = new SqlCommand("someStoredProcedure", connection1))
{
command1.Parameters.Add(new SqlParameter("@UserName", userName));
command1.Parameters.Add(new SqlParameter("@ProductCode", code));
SqlDataReader dr = command1.ExecuteReader(CommandBehavior.CloseConnection);
results.Load(dr);
}
connection1.Close();
}
}
catch (Exception ex)
{
}
return results;
}
@UserName nvarchar(256),
@ProductCode nvarchar(256),
@StartDate nvarchar(256) = '1/1/1900',
@EndDate nvarchar(256) = '12/30/2012'
AS
BEGIN
SET NOCOUNT ON;
Declare @UserID int
Select @UserID = Users.UserID
from Users
where Users.Email = @UserName
Попробуйте убедиться, что тип команды установлен в хранимую процедуру.
mycommand.CommandType = System.Data.CommandType.StoredProcedure;
Вы получите это исключение, если значение переменной 'userName' равно null
Если значение null действителен, вместо этого передайте 'DBNull.Value' в db:
command1.Parameters.Add(new SqlParameter("@UserName", (userName ?? DBNull.Value));
По умолчанию свойство CommandText
должно содержать полную команду SQL, а не только имя хранимой процедуры.
Вы можете изменить это, чтобы установить свойство SqlCommand
CommandType
в StoredProcedure
.
В качестве альтернативы вы можете явно передать параметры, изменив CommandText
на "someStoredProcedure @UserName, @ProductCode"
; это полный оператор SQL и будет работать со значением по умолчанию CommandType
Text
.
EDIT: я просто попробовал, и единственный способ получить это сообщение об ошибке без установки CommandType
в StoredProcedure
(чего он не делал) - это если CommandText
is EXEC someStoredProcedure
. Передача параметра null
дает другую ошибку.
Command1.CommandType = System.Data.CommandType.StoredProcedure
Это заставит ExecuteReader выполнить exec вместо того, чтобы просто попробовать его как плоскую команду.