Подтвердить что ты не робот

Ado.net - свойство Size имеет недопустимый размер 0

Я пытаюсь получить выходное значение из БД через 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 Я могу опустить размер. Почему я получаю это исключение? Как заставить его работать без прохождения размера?
Спасибо за помощь!

4b9b3361

Ответ 1

VarChar и NVarChar являются полями переменной ширины (таким образом, var + char). Вы должны установить длину, в противном случае значение по умолчанию равно нулю.

Ответ 2

Параметр Размер необходим для переменных размеров. Выходные параметры. Обычно ADO.NET определяет размер параметра на основе значения, присвоенного параметру (следовательно, он является необязательным), но в параметре вывода, поскольку значение не установлено, вам необходимо указать размер, необходимый для параметра

Задайте размер параметра для размера выходной переменной из базы данных... Скажите 50

outParam.Size = 50;

Ответ 3

Кстати, установка свойства размера выходного параметра необходима, даже если он не является строковым параметром. Например, если вы используете System.Data.SqlDbType.Int, вы должны установить размер 4.

Ответ 4

Проверьте MSDN: Свойство SqlParameter.Size

Для двунаправленных и выходных параметров и возвращаемых значений вы должны установить значение "Размер". Это не требуется для входных параметров, и если это явно не задано, это значение выводится из фактического размера указанного параметра при выполнении параметризованного оператора.

Ответ 5

Я не уверен, что это та же проблема, что и раньше, но использование байта для параметра иногда может привести к этой ошибке.

Попробуйте это. Явно объявляю параметр я в качестве переменной. Затем назначьте это значение с помощью свойства Value.

Ответ 6

Каждый ответ был так же ясен, как и грязь для меня. Возможно, теперь это поможет кому-то, что я нашел, что сработало.

Нужно добавить размер к параметру

        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");

Ответ 7

Кроме того, вы можете получить фактический размер параметров, проверив sproc с помощью этой небольшой команды:

SqlCommandBuilder.DeriveParameters(yourCommand)

а затем просто проведите свой путь через набор параметров.