DbNull 总是作为 return 值从 SQL C# 服务器存储过程返回 Spring.NET

DbNull always coming back as a return value from SQL Server stored procedure in C# Spring.NET

我有一个简单的存储过程,现在只有 return 数字 100。当我在调试时检查 returnvalue 参数时,从 C# 执行它会给我 DBNull。我知道我的存储过程只是 return 100 是荒谬的,但我的真实逻辑遇到了同样的错误,所以我将它更改为我试图弄清楚如何获得小数的最简单版本在 C# 中,来自我的存储过程的 return 值。

我得到的具体异常(异常位置如下所示)是 System.InvalidCastException: Object cannot be cast from DBNull to other types.

我只更改了下面代码中的名称。

我有以下 C# 代码

public class MyDataContext : AdoDaoSupport, IMyDataContext
{
    //Injected from web.config via spring.NET 
    // sp_GetOneHundred
    public string GetOneHundredProc { get; set; }

    public void Process(string name)
    {
        try
        {
            //Call Stored Procedure
            CallGetOneHundredStoredProcedure(name);
        }
        catch 
        {
            throw;
        }
   } 
   private bool CallGetOneHundredStoredProcedure(string name)
   {
        IDbParameters parameters = CreateDbParameters();
        parameters.Add("Name", DbType.String, 254).Value = name;
        var returnValue = parameters.Add("return_value", DbType.Int32);
        returnValue.Direction = ParameterDirection.ReturnValue;

        try
        {
           var  x = AdoTemplate.ExecuteNonQuery(
                   CommandType.StoredProcedure,
                   GetOneHundredProc,
                   parameters);


           return Convert.ToDecimal(returnValue.Value) == 1;
        }
        catch (Exception e)
        {
            //Exception thrown here
            throw;
        }

    }
}

以及下面的存储过程

ALTER PROCEDURE [dbo].[sp_GetOneHundred]
    @Name varchar(254)      
AS
BEGIN
   SET NOCOUNT ON;


   DECLARE @oneHundred AS Int;
   SET @oneHundred=100;
   RETURN @oneHundred;
END;

编辑:为了好玩,我尝试这样做并得到了一个不同的异常:

 return Convert.ToDecimal(parameters["return_value"].Value) == 1;

我收到的新异常是

 System.IndexOutOfRangeException: An SqlParameter with ParameterName 'return_value' is not contained by this SqlParameterCollection.

也许这可以帮助别人弄清楚发生了什么

万一有人遇到同样的问题,我找到了答案。我所要做的就是在检查值

时在我的参数名称之前包含 @ 符号
return Convert.ToDecimal(parameters["@return_value"].Value) == 1;

请注意,我没有修改定义参数的行,那里没有@符号。

var returnValue = parameters.Add("return_value", SqlDbType.Int);
returnValue.Direction = ParameterDirection.ReturnValue;