我正试图通过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,我可能会省略大小。为什么我会得到这个例外?
如何在不通过尺寸的情况下使其工作?
谢谢你的帮助!
答案 0 :(得分:58)
VarChar和NVarChar是可变宽度字符字段(因此var + char)。您必须设置长度,否则默认值为零。
答案 1 :(得分:45)
参数大小是可变大小输出参数所必需的。通常,ADO.NET根据分配给参数的值来决定参数的大小(因此它是可选的),但是在输出参数中,因为没有设置值,您需要提供参数所需的大小
将参数大小设置为DB中输出变量的大小...说50
outParam.Size = 50;
答案 2 :(得分:14)
顺便说一句,即使输出参数不是字符串类型参数,也必须设置输出参数的size属性。例如,如果您使用的是System.Data.SqlDbType.Int,则应将大小设置为4.
答案 3 :(得分:9)
检查MSDN:SqlParameter.Size Property
对于双向和输出参数以及返回值,必须设置Size的值。输入参数不需要这样做,如果没有显式设置,则在执行参数化语句时,从指定参数的实际大小推断出该值。
答案 4 :(得分:2)
每个人的回答都和我一样清楚。也许这会帮助别人,因为我发现了什么有用。
需要为参数
添加大小 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");
答案 5 :(得分:1)
我不确定这是否与之前的问题相同,但使用参数字节有时会导致此错误。
试试这个。将i参数明确声明为变量。 然后使用Value属性赋值。
答案 6 :(得分:0)
此外,您可以通过使用以下命令检查sproc来获取参数的实际大小:
SqlCommandBuilder.DeriveParameters(yourCommand)
然后只是通过参数集合预先通过。
答案 7 :(得分:0)
我发生了这个错误,提供了一个非字符串但可以为空的类型的值。就我而言,int?
。我通过传入一个不可为空的int
来修复它。
答案 8 :(得分:0)
您必须设置参数输出的大小
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());
}
答案 9 :(得分:0)
我有同样的错误,下面是我的代码
cmd.Parameters("@ProjectKey").SqlDbType = SqlDbType.NVarChar
cmd.Parameters("@ProjectKey").Size = 150
cmd.Parameters("@ProjectKey").Direction = ParameterDirection.InputOutput
cmd.ExecuteNonQuery()