ADO.NET - Size 属性的大小为 0 无效

Posted

技术标签:

【中文标题】ADO.NET - Size 属性的大小为 0 无效【英文标题】:ADO.NET - The Size property has an invalid size of 0 【发布时间】:2011-04-15 03:06:01 【问题描述】:

我正在尝试通过 ADO.NET 从 DB 获取输出值。有一个客户端代码:

    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 Property 我可能会省略尺寸。为什么会出现此异常?

如何在不传递大小的情况下使其工作?

【问题讨论】:

为什么要避免设置 Size 属性... 【参考方案1】:

VarChar 和 NVarChar 是可变宽度字符字段(因此是 var+char)。您必须设置长度,否则默认为零。

【讨论】:

如果我为 int 提供 size = 1000 怎么办?我会得到例外吗? @StuffHappens - 无论您给出什么大小,varchar 和 NVarchar 始终会根据数据长度进行调整。因此,您可以设置任何大小(Nvarchar 为 MAX 4000,varchar 为 8000)。不会痛的。 只是补充一点,如果您为参数分配一个值,该值的大小将用作默认值而不是 0(即您可以省略大小)。【参考方案2】:

可变大小的输出参数需要参数大小。一般ADO.NET根据分配给参数的Value来决定参数的大小(因此它是可选的),但是在输出参数中由于没有设置值,您需要提供参数所需的大小

将参数大小设置为来自数据库的输出变量的大小...说 50

outParam.Size = 50;

【讨论】:

它有帮助。但我不想传递任何大小(我有一定的原因)。 如果你想避免大小,那么我能想到的就是将结果作为 DataTable / DataSet。但这需要您更改 SP。【参考方案3】:

顺便说一下,设置输出参数的大小属性是必要的,即使它不是字符串类型的参数。例如,如果您使用 System.Data.SqlDbType.Int,则应将大小设置为 4。

【讨论】:

+100 分是唯一指出即使是非字符串类型的输出参数也需要指定大小的人。如果使用带有 null 值 int? 的 SqlParameter(name, value) 构造函数,系统将推断大小为 0 而不是 4(如我所料)。 宾果游戏。那是我的问题。然而,对我来说,设置 SqlDbType 就足够了。我的猜测是 Sql 库在这种情况下从类型推断大小。【参考方案4】:

查看 MSDN:SqlParameter.Size Property

对于双向和输出参数,以及返回值,你必须设置Size的值。这对于输入参数是不需要的,如果没有显式设置,则在执行参数化语句时,根据指定参数的实际大小推断该值。

【讨论】:

【参考方案5】:

每个人的答案对我来说都像泥巴一样清晰。既然我找到了有效的方法,也许这会对某人有所帮助。

需要给参数加上大小

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

【讨论】:

【参考方案6】:

我不确定这是否与我之前遇到的相同问题,但使用字节作为参数有时会导致此错误。

试试这个。将 i 参数显式声明为变量。 然后使用 Value 属性为其赋值。

【讨论】:

【参考方案7】:

此外,您可以通过使用以下小命令检查存储过程来获取参数的实际大小:

SqlCommandBuilder.DeriveParameters(yourCommand)

然后就在参数集合中寻找自己的方式。

【讨论】:

【参考方案8】:

我发生了这个错误,提供了一个非字符串但可以为空的类型的值。就我而言,int?。我通过传入不可为空的int 来修复它。

【讨论】:

【参考方案9】:

你必须为参数输出设置大小

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

【讨论】:

【参考方案10】:

我遇到了同样的错误,下面是我的有效代码

cmd.Parameters("@ProjectKey").SqlDbType = SqlDbType.NVarChar
cmd.Parameters("@ProjectKey").Size = 150
cmd.Parameters("@ProjectKey").Direction = ParameterDirection.InputOutput
cmd.ExecuteNonQuery()

【讨论】:

以上是关于ADO.NET - Size 属性的大小为 0 无效的主要内容,如果未能解决你的问题,请参考以下文章

CSS中带斜线的字体大小

ADO.NET 正确插入数据

ADO.NET(课程学习内容)

您如何确定现实世界中推荐的 ADO.NET 批量大小?

CSS样式表控制背景图片大小

连接字符串中连接池 ADO.Net 支持的最大和最小大小是多少?