Ado.net - Size属性的大小无效

时间:2010-09-21 10:13:25

标签: c# sql-server ado.net

我正试图通过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,我可能会省略大小。为什么我会得到这个例外? 如何在不通过尺寸的情况下使其工作?
谢谢你的帮助!

10 个答案:

答案 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()