Ответ 1
VarChar и NVarChar являются полями переменной ширины (таким образом, var + char). Вы должны установить длину, в противном случае значение по умолчанию равно нулю.
Я пытаюсь получить выходное значение из БД через ADO.net. Там код клиента:
using (var connection = new SqlConnection(ConnectionString))
{
connection.Open();
SqlCommand command = new SqlCommand("pDoSomethingParamsRes", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@i", 1);
var outParam = new SqlParameter("@out", SqlDbType.VarChar);
outParam.Direction = ParameterDirection.Output;
command.Parameters.Add(outParam);
command.ExecuteNonQuery();
Console.WriteLine(command.Parameters["@out"].Value.ToString());
}
Когда я запускаю это, я получаю следующее исключение:
the Size property has an invalid size of 0
В соответствии с руководством Свойство SqlParameter.Size Я могу опустить размер. Почему я получаю это исключение?
Как заставить его работать без прохождения размера?
Спасибо за помощь!
VarChar и NVarChar являются полями переменной ширины (таким образом, var + char). Вы должны установить длину, в противном случае значение по умолчанию равно нулю.
Параметр Размер необходим для переменных размеров. Выходные параметры. Обычно ADO.NET определяет размер параметра на основе значения, присвоенного параметру (следовательно, он является необязательным), но в параметре вывода, поскольку значение не установлено, вам необходимо указать размер, необходимый для параметра
Задайте размер параметра для размера выходной переменной из базы данных... Скажите 50
outParam.Size = 50;
Кстати, установка свойства размера выходного параметра необходима, даже если он не является строковым параметром. Например, если вы используете System.Data.SqlDbType.Int, вы должны установить размер 4.
Проверьте MSDN: Свойство SqlParameter.Size
Для двунаправленных и выходных параметров и возвращаемых значений вы должны установить значение "Размер". Это не требуется для входных параметров, и если это явно не задано, это значение выводится из фактического размера указанного параметра при выполнении параметризованного оператора.
Я не уверен, что это та же проблема, что и раньше, но использование байта для параметра иногда может привести к этой ошибке.
Попробуйте это. Явно объявляю параметр я в качестве переменной. Затем назначьте это значение с помощью свойства Value.
Каждый ответ был так же ясен, как и грязь для меня. Возможно, теперь это поможет кому-то, что я нашел, что сработало.
Нужно добавить размер к параметру
DynamicParameters Params = new DynamicParameters();
Params.Add("@ProfileID", ProfileID);
Params.Add("@CategoryName", CategoryName);
Params.Add("@Added", dbType: DbType.String, direction: ParameterDirection.Output,size:10);
db.Execute(sql, Params, commandType: CommandType.StoredProcedure, commandTimeout: 60);
var Added = Params.Get<string>("@Added");
Кроме того, вы можете получить фактический размер параметров, проверив sproc с помощью этой небольшой команды:
SqlCommandBuilder.DeriveParameters(yourCommand)
а затем просто проведите свой путь через набор параметров.