我在 SQL 服务器数据库中有一个标量函数,我想使用 ADO.NET 调用它,但它总是 returns null
I have a scalar function in a SQL Server database which I want to to call using ADO.NET but it always returns null
我有一个标量函数,它 return 在 SQL 服务器中有一个值。我试图通过调用 ExecuteScalar
来获取该值,但它总是 returns NULL 并且 C# 抛出 NullReferenceException
.
我创建了一个检查房间可用性的功能;如果房间可用,它应该 return roomId
,否则 0
.
我在 C# 中使用 ADO.NET 调用该函数,但在这种情况下,它会引发异常。
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 服务器标量函数:
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
预期结果:
- 如果房间可用 return 房间 ID
- 其他return 0
您需要更改从 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());
}
对于标量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)技术。
我有一个标量函数,它 return 在 SQL 服务器中有一个值。我试图通过调用 ExecuteScalar
来获取该值,但它总是 returns NULL 并且 C# 抛出 NullReferenceException
.
我创建了一个检查房间可用性的功能;如果房间可用,它应该 return roomId
,否则 0
.
我在 C# 中使用 ADO.NET 调用该函数,但在这种情况下,它会引发异常。
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 服务器标量函数:
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
预期结果:
- 如果房间可用 return 房间 ID
- 其他return 0
您需要更改从 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()); }
对于标量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)技术。