5

1 つの入力パラメーターと 1 つの出力パラメーターを持つ次の 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

CanUserEdit上記の列のストアド プロシージャtblUsersはビット型の列で、デフォルト値は 0 です。Management Studio でこのプロシージャを実行すると問題なく実行されますcommand.ExecuteScalar()が、C# コードで使用すると、常に が返されます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;
        }
    }
}

敬具

4

2 に答える 2

0

ストアド プロシージャの代わりにスケーラー関数を使用します。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;
    }
于 2021-02-05T23:37:11.147 に答える