我有以下SQL存储过程,其中包含一个输入参数和一个out参数。
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
在上面的存储过程中,CanUserEdit
中的tblUsers
列是位类型列,默认值为0.现在,当我在Management Studio中执行此过程时,它运行正常,但是当我使用{{1在我的C#代码中,它总是返回command.ExecuteScalar()
。谁能告诉我这里我做错了什么。
以下是我的C#方法
null
亲切的问候
答案 0 :(得分:13)
问题在于您返回数据的方式。如果你想使用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'。
答案 1 :(得分:0)
使用缩放函数而不是存储过程。 SQL 函数更容易设置,默认情况下它们返回一个缩放值,因此不需要“输出”或返回变量声明。示例:
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;
}