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;
我有一个简单的存储过程,现在只有 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;