9

文字列フィールドのユーザー名に基づいて、単一のテーブルから整数値を取得しようとしています。ストアド プロシージャとダイレクト テキストを使用して試しました。ストアド プロシージャを実行すると、適切な戻り値が得られます。ただし、適切な結果は得られません。

ここにコードの両方のセットがあります - 直接テキスト -

public int GetUserRole(string CUSER)
{
    try
    {
        SQLCON = new SqlConnection(connectionString);
        SQLCON.Open();
        SQLCommand = new SqlCommand();
        SQLCommand.CommandType = CommandType.Text;
        SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER;
        SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = CUSER";
        Int32 USRole = (Int32) SQLCommand.ExecuteScalar();

        return USRole;

    }
    catch
    {
        HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false);
        return 0;
    }
}

SQL クエリ:

ALTER PROCEDURE [dbo].[spGetUserRole]
-- Add the parameters for the stored procedure here
    @username VARCHAR(50)
AS
BEGIN
-- Declare the return variable here
DECLARE @USRole as int

-- Add the T-SQL statements to compute the return value here
SELECT @USRole = tblUser.USRole FROM tblUser WHERE USUsername = @username

-- Return the result of the function
RETURN @USRole  
END
4

5 に答える 5

16

パラメータを正しく参照していません。USUsername という名前のパラメーターを追加する場合は、コマンド テキストで @USUsername を使用する必要があります。

public int GetUserRole(string CUSER)
{
    try
    {
        SQLCON = new SqlConnection(connectionString);
        SQLCON.Open();
        SQLCommand = new SqlCommand();
        SQLCommand.CommandType = CommandType.Text;
        SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER;
        SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = @USUsername";
        Int32 USRole = (Int32) SQLCommand.ExecuteScalar();

        return USRole;

    }
    catch (Exception)
    {
        HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false);
        return 0;
    }
}

ここのパラメーター名も一致する必要があり、戻り変数は必要ないため、ストアドプロシージャも更新する必要があります。

ALTER PROCEDURE [dbo].[spGetUserRole]
-- Add the parameters for the stored procedure here
@USUsername VARCHAR(50)

AS
BEGIN

-- Add the T-SQL statements to compute the return value here
SELECT tblUser.USRole FROM tblUser WHERE USUsername = @USUsername

END

また、「using」構文を使用してデータベース接続を自動的に閉じることも検討する必要があります。ここで Scott Hanselman の例を参照してください - http://www.hanselman.com/blog/WhyTheUsingStatementIsBetterThanASharpStickInTheEyeAndASqlConnectionRefactoringExample.aspx

于 2012-05-30T16:32:41.347 に答える
1

ストアドプロシージャの戻り値()を使用する代わりにRETURN @USRole、Selectステートメント(eg)を使用して結果を送り返しますSelect @USRole。何が起こっているのかというと、ストアドプロシージャの戻り値は、ExecuteScalarで使用される値と同じではないということです。ExecuteScalarは、出力の最初の列と行を返します。戻り値は異なり、特別な名前@RETURN_VALUEのパラメーターまたは特別なParameterDirection.ReturnValueプロパティを使用してアクセスする必要があります。

手順の改訂版は次のようになります。

ALTER PROCEDURE [dbo].[spGetUserRole]
-- Add the parameters for the stored procedure here
@USUsername VARCHAR(50)

AS
BEGIN

-- Add the T-SQL statements to compute the return value here
Select tblUser.USRole 
FROM tblUser 
WHERE USUsername = @USUsername

END

RETURN(Transact-SQL)

SqlCommand.ExecuteScalarメソッド

于 2012-05-30T16:26:48.827 に答える
1

ストアド プロシージャをどのように呼び出したかはわかりませんが、投稿したクエリにバグがあります。

"SELECT USRole FROM tblUser WHERE USUsername = CUSER"

に置き換える必要があります

SQLCommand.Parameters.Add("@USUsername", SqlDbType.VarChar).Value = CUSER;
"SELECT USRole FROM tblUser WHERE USUsername = @USUsername"


現在、実際にはクエリのパラメーター部分を作成していませんが、列内で値 CUSER を見つけようとしています

于 2012-05-30T16:27:49.963 に答える
0

パラメータを正しく使用してください。そしてfinallyステートメントで接続を閉じることを忘れないでください。

 public int GetUserRole(string CUSER)
    {
        try
        {
            SQLCON = new SqlConnection(connectionString);
            SQLCON.Open();
            SQLCommand = new SqlCommand();
            SQLCommand.CommandType = CommandType.Text;
            SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = @USUsername  ";
            SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER;

            Int32 USRole = (Int32) SQLCommand.ExecuteScalar();

            return USRole;

        }
        catch (Exception)
        {
            HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false);
            return 0;
        }
        finally { close connection here.. }

    }
于 2012-05-30T16:26:58.123 に答える
0

戻り値の使用を主張する場合は、パラメーターの方向を設定し、ExecuteNonQuery を使用してそれを行うことができます。

SqlParameter p = cmd.Parameters.Add("@USRole", SqlDbType.Int);
p.Direction = ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery(); 
int returnvalue = (int)cmd.Parameters["@USRole"].Value;

selectExecuteScalar を使用する場合は、代わりに proc を変数に変更します。Return

パラメータ名に入力するものは任意であることに注意してください。

于 2012-05-30T16:33:01.460 に答える