【问题标题】:ADO.NET - The Size property has an invalid size of 0ADO.NET - Size 属性的大小为 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 属性...

标签: c# sql-server ado.net


【解决方案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()
              

              【讨论】:

                猜你喜欢
                • 2012-01-27
                • 1970-01-01
                • 2020-01-22
                • 2021-10-04
                • 1970-01-01
                • 2016-05-11
                • 1970-01-01
                相关资源
                最近更新 更多