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 无效的主要内容,如果未能解决你的问题,请参考以下文章