当我尝试从SQL Server存储过程获取INT
类型的输出值时,我遇到一个问题,然后我得到NULL值。
这是存储过程:
CREATE PROCEDURE dbo.NULLISSUE
@input VARCHAR(10),
@output INT = 0 OUTPUT
AS
BEGIN
IF @input >= '1'
BEGIN
SET @output = @output + 1
RETURN(0)
END
END
这是.NET代码:
using (var connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand())
{
command.Connection = connection;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "dbo.NULLISSUE";
command.Parameters.Clear();
command.Parameters.AddWithValue("@input", "1");
command.Parameters.AddWithValue("@output", SqlDbType.Int);
command.Parameters["@output"].Value = 0;
command.Parameters["@output"].Direction = ParameterDirection.Output;
command.CommandTimeout = 3000;
connection.Open();
command.ExecuteNonQuery();
connection.Close();
Console.WriteLine(command.Parameters["@output"].Value);
//null value ?
Console.ReadLine();
}
}
我通过在过程中进行ISNULL(@output, 0)
来解决问题,但是不确定为什么可以在.NET方面完成,以及为什么ADO.NET无法通过/设置/初始化OUTPUT参数= 0。
谢谢。
答案 0 :(得分:4)
@output
使用客户端中设置的初始值,则必须为ParameterDirection.InputOutput
。
当前,由于其值为ParameterDirection.Output
,因此该值被忽略,该值在过程中默认为NULL
,而NULL + anything
的结果为NULL
。