У меня есть хранимая процедура, которая имеет параметр под названием UserName, и в моем коде позади я сделал, чтобы SqlCommand возразил, что я добавляю параметры к с Добавить методом. Но по некоторым причинам когда объект команды пытается выполнить метод ExecuteReader, он выдает исключение. Я полностью в недоумении и понятия не имею, почему это не распознает параметр. Прежде чем метод ExecuteReader выполняется, мне установили точку останова, таким образом, я могу подтвердить, что объект команды действительно содержит установленные параметры, который верен. Я знаю, что хранимая процедура действительно возвращает корректные данные, когда параметры не добавляются к объекту команды, но трудно кодируются в фактической хранимой процедуре. Ниже сообщение об исключении, которое дано в блоке выгоды. Я также вставлю свой код и первую часть хранимой процедуры. Я был бы очень признателен за любую справку в этой проблеме, видя, что я попробовал много разных подходов напрасно. Заранее спасибо.
Процедура или функция '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;
Command1.CommandType = System.Data.CommandType.StoredProcedure
Это заставит ExecuteReader выполнить exec вместо того, чтобы просто попробовать его как простую команду.
С помощью управления IIS добавьте пользовательский заголовок Cache-Control
со значением no-cache
. Это заставит браузер проверить, что любая кэшированная версия XAP является последней перед ее использованием.
Документация MDN довольно хорошая, ИМО.
-121--606055-Функция, содержащая ключевое слово выхода, является генератором. Когда вы его называете, его формальные параметры привязаны к фактическим аргументам, но его тело на самом деле не оценивается. Вместо этого возвращается генератор-итератор. Каждый вызов следующего метода генератора-итератора () выполняет другой проход через итеративный алгоритм. Значение каждого шага - это значение, указанное ключевым словом выхода. Рассмотрим выход как генераторно-итераторную версию возврата, указывающую границу между каждой итерацией алгоритма. Каждый раз при вызове next () код генератора возвращается из инструкции, следующей за выходом.
По умолчанию свойство CommandText
должно содержать полную команду SQL, а не только имя хранимой процедуры.
Это значение можно изменить, установив для свойства SqlCommand
CommandType
значение StoredProcedure
.
Можно также явно передать параметры, изменив значение CommandText
на «someStoredProcedure @ UserName, @ ProductCode»
; это полная инструкция SQL, которая будет работать с типом CommandType
по умолчанию Text
.
EDIT : Я только что попробовал это, и единственный способ получить это сообщение об ошибке без установки CommandType
в значение StoredProcedure
(чего он не делал), если CommandText
- это EXEC someStoredProcedure
. Передача параметра null
приводит к другой ошибке.
Вы получите это исключение, если значение вашей переменной 'userName' равно null
Если null допустимо, то вместо этого передайте DBNull.Value в базу данных:
command1.Parameters.Add(new SqlParameter("@UserName", (userName ?? DBNull.Value));