存储过程的输出参数未更新

时间:2015-06-05 06:28:10

标签: c# sql sql-server linq-to-sql ado.net

我创建了一个linq2sql项目,其中我有一个用于调用SP的扩展方法。 此扩展方法功能很少 -

  • 可以使用表值参数调用SP。
  • 它可以接受输入和输出参数
  • 它将处理多个结果集

扩展方法 -

public partial class TestLinq2SqlDataContext : DataContext
{
public IMultipleResults ExceuteProcedure(string spName, IEnumerable<SqlParameter> parameters, SqlConnection sqlConnection, out SqlDataReader reader)
{
    reader = null;
    try
    {
        sqlConnection.Open();
        var cmd = new SqlCommand
            {
                Connection = sqlConnection,
                CommandText = spName,
                CommandType = CommandType.StoredProcedure
            };

        cmd.Parameters.AddRange(parameters.ToArray());
        reader = cmd.ExecuteReader();
        return Translate(reader);
    }
    catch (Exception)
    {
    }
    return null;
}
}

我打电话给SP -

CREATE PROCEDURE USP_OutPutParameterCheck(
   @Id int OUTPUT,
   @Name nvarchar(50) OUTPUT)
AS 
BEGIN   
    SET @Id = 12 SET @Name = N'NameSet for OutputParameter'
END

我的C#代码是

public static void Main(){
context = new TestLinq2SqlDataContext();

#region USP_OutPutParameterCheck

var connection1 = context.Connection as SqlConnection;
SqlDataReader dataReader1;
var outParam1 = new SqlParameter
{
    Direction = ParameterDirection.Output,
    Value = "Abc",
    DbType = DbType.String,
    ParameterName = "@Name"
};
var outParam2 = new SqlParameter
{
    Direction = ParameterDirection.Output,
    Value = 1,
    DbType = DbType.Int32,
    ParameterName = "@Id"
};
var parameters11 = new[]
    {
        outParam1,
        outParam2
    };
var data21 = context.ExceuteProcedure("USP_OutPutParameterCheck", parameters11, connection1, out dataReader1);
}

现在当我在调试模式中检查输出参数的值时,我得到的@Id值完美 但对于@Name参数,我只能获得&#39; N&#39; 值,而不是&#39; NameSet for OutputParameter&#39;

任何人都可以帮助我解决我在哪里出错吗?

由于

更新:

在调试模式下查看参数值时添加屏幕截图 - debug mode

1 个答案:

答案 0 :(得分:1)

我认为您必须指定outParam1的大小。

请参阅:https://msdn.microsoft.com/en-us/library/system.data.common.dbparameter.size(v=vs.110).aspx

  

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