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

当我运行这个我得到以下exception:

 the Size property has an invalid size of 0 

根据手动SqlParameter.Size属性我可能会忽略大小。 为什么我得到这个exception? 如何使它的工作不通过大小?
感谢您的帮助!

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

参数大小是可变大小输出参数所必需的。 一般来说,ADO.NET根据赋给参数的值来决定参数的大小(因此它是可选的),但是在输出参数中,因为没有设置值,所以需要提供参数所需的大小

将参数大小设置为来自DB的输出variables的大小…说50

 outParam.Size = 50; 

顺便提一下,即使不是stringtypes参数,也需要设置输出参数的size属性。 例如,如果您使用的是System.Data.SqlDbType.Int,则应将其大小设置为4。

检查MSDN: SqlParameter.Size属性

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

我不知道这是否是我曾经有过的相同的问题,但使用一个字节的参数有时会导致这个错误。

尝试这个。 显式声明i参数为一个variables。 那么用Value属性赋值。

另外,通过使用这个小命令检查存储区,你可以得到参数的实际大小:

 SqlCommandBuilder.DeriveParameters(yourCommand) 

然后只是通过参数集合foreach你的方式。

每个人的回答都像我一样清晰。 也许这会帮助一个人,现在我发现什么工作。

需要添加大小的参数

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