我有以下带有一个输入参数和一个输出参数的 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。现在,当我在 Management Studio 中执行此过程时,它运行正常,但当我在我的 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,你不应该返回,而是简单地选择。
尝试改变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”。
关于c# - Command.ExecuteScalar 始终返回 null,而 Management Studio 中的存储过程运行正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18529956/