C# ADO.NET-Size属性的大小0无效
我正在尝试通过ADO.NET从DB获取输出值。有一个客户端代码:C# ADO.NET-Size属性的大小0无效,c#,sql-server,ado.net,C#,Sql Server,Ado.net,我正在尝试通过ADO.NET从DB获取输出值。有一个客户端代码: using (var connection = new SqlConnection(ConnectionString)) { connection.Open(); SqlCommand command = new SqlCommand("pDoSomethingParamsRes", connection); command.CommandType = Command
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
根据手册,我可能会省略尺寸。为什么我会得到这个例外
如何使其在不通过尺寸的情况下工作 可变大小输出参数需要参数大小。通常,ADO.NET根据指定给参数的值决定参数的大小(因此它是可选的),但在输出参数中,由于未设置值,因此需要提供参数所需的大小 将参数大小设置为DB中输出变量的大小。。。说50
outParam.Size = 50;
我不确定这是否与我以前遇到的问题相同,但使用字节作为参数有时会导致此错误 试试这个。将i参数显式声明为变量。
然后用value属性指定它的值。VarChar和NVarChar是可变宽度的字符字段(因此是var+char)。必须设置长度,否则默认值为零。检查MSDN:
对于双向和输出参数以及返回值,必须设置大小的值。这对于输入参数不是必需的,如果没有显式设置,则在执行参数化语句时从指定参数的实际大小推断该值。顺便说一句,即使输出参数不是字符串类型的参数,也需要设置其size属性。例如,如果您使用的是System.Data.SqlDbType.Int,则应将大小设置为4。此外,您还可以通过使用以下小命令检查存储过程来获取参数的实际大小:
SqlCommandBuilder.DeriveParameters(yourCommand)
然后你就可以通过参数集合来找到答案了。每个人的答案对我来说都很清楚。也许这会对我找到有效方法的人有所帮助 需要向参数添加大小
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");
DynamicParameters Params=新的DynamicParameters();
参数Add(“@ProfileID”,ProfileID);
参数Add(“@CategoryName”,CategoryName);
Params.Add(“@Added”,dbType:dbType.String,方向:ParameterDirection.Output,大小:10);
Execute(sql,Params,commandType:commandType.StoredProcess,commandTimeout:60);
var Added=Params.Get(“@Added”);
我遇到了这个错误,提供了一个非字符串但可为空的类型的值。在我的例子中,一个int?
。我通过传入一个不可为空的int
来修复它。您必须为参数输出设置大小
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());
}
我也有同样的错误,下面是我的代码
cmd.Parameters("@ProjectKey").SqlDbType = SqlDbType.NVarChar
cmd.Parameters("@ProjectKey").Size = 150
cmd.Parameters("@ProjectKey").Direction = ParameterDirection.InputOutput
cmd.ExecuteNonQuery()
这很有帮助。但是我不想传递任何大小(我有一定的原因)。如果您想要避免大小,那么我所能想到的就是将结果作为DataTable/DataSet。但这需要您更改SP。如果我为int提供size=1000会怎么样?我会得到一个例外吗?@StuffOccesss-无论您给出的数据大小如何,varchar和NVarchar都会根据数据长度进行调整。因此,您可以设置任何大小(Nvarchar的最大值为4000,varchar的最大值为8000)。这不会有什么坏处。只需补充一点,如果您为参数指定了一个值,该值的大小将用作默认值,而不是0(即,您可以忽略大小)。为什么要避免设置size属性…+100点,因为这是唯一一个指出即使是非字符串类型的输出参数也需要指定大小的参数。如果使用带有空值int?的SqlParameter(name,value)构造函数,系统将推断大小为0而不是4(如我所预期的)。宾果。那是我的问题。但是,对我来说,设置SqlDbType就足够了。我的猜测是,在这种情况下,Sql库根据类型推断大小。