我有一个标量函数,该函数在SQL Server中返回一个值。我试图通过调用ExecuteScalar
来获取该值,但是它总是返回NULL,并且C#抛出NullReferenceException
。
我创建了一个检查房间可用性的功能;如果有空房间,则应返回roomId
,否则返回0
。
我正在使用ADO.NET在C#中调用该函数,但是在这种情况下,它将引发异常。
ADO.NET代码:
using (SqlConnection con = new SqlConnection(connectionString))
{
var command = con.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "RoomAvailability";
con.Open();
int returnValue = (int)command.ExecuteScalar();
// The error happens on this line
Console.WriteLine(returnValue.ToString());
}
SQL Server标量函数:
ALTER FUNCTION RoomAvailability()
RETURNS INT
AS
BEGIN
DECLARE @availability INT
IF EXISTS(SELECT TOP 1 Id FROM Romm_Details WHERE status = 'F')
BEGIN
SET @availability = (SELECT TOP 1 Id FROM Romm_Details WHERE status = 'F')
END
ELSE
BEGIN
SET @availability = 0
END
RETURN @availability //RETURN NULL VALUE
END
预期结果:
答案 0 :(得分:1)
您将需要更改从C#调用SQL Function的方式。
删除command.CommandType = CommandType.StoredProcedure;
-您正在调用函数而不是存储过程
您不能仅通过其name调用SQL函数(如存储过程),而需要将其用作内联查询
using (SqlConnection con = new SqlConnection(connectionString))
{
var command = new SqlCommand("SELECT dbo.RoomAvailability()", con);
con.Open();
int returnValue = (int)command.ExecuteScalar();
Console.WriteLine(returnValue.ToString());
}
答案 1 :(得分:0)
对于标量udf,可以使用CommandType.StoredProcedure,但是您需要添加ReturnValue参数以获得结果。例如:
var command = con.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "RoomAvailability";
con.Open();
SqlParameter p = new SqlParameter("@res", SqlDbType.Int);
p.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(p);
command.ExecuteNonQuery();
int returnValue = (int)p.Value;
或者,如Bharathi的答案所述,使用使用CommandType.Text(默认CommandType)的技术。