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

9 52

9 ответов:

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

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

установите размер параметра в размер выходной переменной из БД... Скажем 50

outParam.Size = 50;

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

Проверьте MSDN:SqlParameter.Размер Собственности

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

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

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

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

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

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

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

SqlCommandBuilder.DeriveParameters(yourCommand)

а затем просто foreach свой путь через коллекцию параметров.

у меня возникла эта ошибка, указав значение, которое имело нестроковый, но nullable, тип. В моем случае int?. Я исправил это, передав в nullable int вместо.

вы должны установить размер для параметра output

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;
    outParam.Size = 50; // this is example
    command.Parameters.Add(outParam);
    command.ExecuteNonQuery();
    Console.WriteLine(command.Parameters["@out"].Value.ToString());
}