当Management Studio中的存储过程运行正常时,Command.ExecuteScaler始终返回null
本文关键字:ExecuteScaler Command null 返回 常时 Studio Management 运行 存储过程 | 更新日期: 2023-09-27 18:29:34
我有下面的SQL存储过程,其中有一个输入参数和一个输出参数。
CREATE PROCEDURE [dbo].[spCanUserEdit]
(
@username nvarchar(255)
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @CanEdit bit
SELECT
@CanEdit = CanUserEdit
FROM tblUsers
WHERE username = LOWER(@username)
RETURN SELECT @CanEdit
END
GO
在上面的存储过程中,tblUsers
中的CanUserEdit
列是位类型列,默认值为0。现在,当我在ManagementStudio中执行此过程时,它运行良好,但当我在C#代码中使用command.ExecuteScalar()
时,它总是返回null
。谁能告诉我我在这里做错了什么吗。
以下是我的C#方法
public static bool CanUserEdit(string userName)
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[Constants.ConnectionStringName].ConnectionString))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "spCanUserEdit";
cmd.Connection = conn;
cmd.Parameters.Add(new SqlParameter("@username", userName));
conn.Open();
bool canEdit = (bool)cmd.ExecuteScalar();
return canEdit;
}
}
}
问题在于返回数据的方式。如果要使用ExecuteScalar,则不应使用RETURN,而应仅使用SELECT。
尝试按以下方式更改SP:
CREATE PROCEDURE [dbo].[spCanUserEdit]
(
@username nvarchar(255)
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @CanEdit bit
SELECT
@CanEdit = CanUserEdit
FROM tblUsers
WHERE username = LOWER(@username)
SELECT @CanEdit
RETURN 0
END
GO
如果不能更改SP,但更改代码,则解决方案是使用ExecuteNonQuery读取参数"@ReturnValue"。
使用缩放器函数而不是存储过程。SQL函数的设置要容易得多,默认情况下它们会返回缩放器值,因此不需要"OUTPUT"或返回变量声明。示例:
CREATE FUNCTION [dbo].[ScalerFnExample]()
RETURNS VARCHAR(50)
AS
BEGIN
RETURN (SELECT TOP 1 Thing FROM Examples.dbo.Stuff)
END
C#示例:
public string SqlScalerFnExample()
{
string retVal = default;
try
{
using (SqlConnection sqlConnection = new SqlConnection("Server=127.0.0.1;Database=Examples;Trusted_Connection=True;"))
{
SqlCommand userFn = new SqlCommand("SELECT dbo.ScalerFnExample()", sqlConnection);
sqlConnection.Open();
retVal = (string)userFn.ExecuteScalar();
}
}
catch (Exception ex)
{
Console.WriteLine($"SqlScalerFnExample() - Exception: {ex.Message}");
}
return retVal;
}