1

こんにちは、私は次のストアドプロシージャを持っています

@UserName varchar(150),
    @UserEmail varchar(300),
    @UserPassword varchar(150), 
    @ContactNumber varchar(150),
    @ContactMobile varchar(150),
    @AreaOfCountry varchar(150),
    @UserId int OUTPUT,
    @AllreadyReg int OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    --DECLARE @UserId int, @AllreadyReg int
    IF (SELECT COUNT(UserId) FROM Users WHERE (UserName = @UserName) OR (UserEmail = @UserEmail)) > 0
    BEGIN
        SET @UserId = 0
        SET @AllreadyReg = 1    
    END
    ELSE 
    BEGIN
        INSERT INTO Users (UserName,UserEmail,UserPassword,ContactNumber,ContactMobile,AreaOfCountry) VALUES (@UserName,@UserEmail,@UserPassword,@ContactNumber,@ContactMobile,@AreaOfCountry)
        SELECT @UserId = SCOPE_IDENTITY()
        SET @AllreadyReg = 0    

    END 

ただし、c# と asp.net を使用して使用すると何も返されませんが、実行すると @UserId と @AllreadyReg の結果が返されますが、戻り値は 0 で単一のフィールドです。

私のC#コードは以下にありますが、行はありません

using (SqlConnection con = new SqlConnection(connectionString))
        {
            Response.Write("Line 61");
            using (SqlCommand cmd = new SqlCommand("spR_Register", con))
            {
                Response.Write("line 64");
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@UserName", TxtUsername.Text.Trim());
                cmd.Parameters.AddWithValue("@UserEmail", TxtEmail.Text.Trim());
                cmd.Parameters.AddWithValue("@UserPassword", TxtPassword.Text.Trim());
                cmd.Parameters.AddWithValue("@ContactNumber", TxtPhone.Text);
                cmd.Parameters.AddWithValue("@ContactMobile", TxtMobile.Text);
                cmd.Parameters.AddWithValue("@AreaOfCountry", TxtAreaOfCountry.SelectedValue);
                cmd.Parameters.AddWithValue("@UserId", ParameterDirection.Output);
                cmd.Parameters.AddWithValue("@AllreadyReg", ParameterDirection.Output);
                con.Open();
                SqlDataReader reader = cmd.ExecuteReader();
                if (reader.HasRows)
                {
                    Response.Write("line 78");
                    etc etc

誰か助けてくれませんか

ありがとう

4

3 に答える 3

4

編集: 間違いは、データ グリッドを選択しないExecuteReaderコマンドで使用することです。これは で行う必要があります。ExecuteNonQuery


ここで重要なのは、パラメータをどのように追加するかです。例えば:

var alreadyReg = cmd.CreateParameter();
alreadyReg.Direction = System.Data.ParameterDirection.Output;
alreadyReg.ParameterName = "AllreadyReg";
alreadyReg.DbType = DbType.Int32;
cmd.Parameters.Add(alreadyReg);
//...
cmd.ExecuteNonQuery();
//...
int val = (int)alreadyReg.Value;

オブジェクトのタイプによってはDbCommand、これらすべてを 1 行で受け入れるオーバーロードが存在する場合があります。上記ではDbCommand. を使用SqlCommandすると、少し単純化できます。

var alreadyReg = cmd.Parameters.Add("AllreadyReg", SqlDbType.Int);
alreadyReg.Direction = ParameterDirection.Output;
//...
cmd.ExecuteNonQuery();
//...
int val = (int)alreadyReg.Value
于 2013-11-12T13:44:03.870 に答える
0

ここ

cmd.Parameters.AddWithValue("@UserId", ParameterDirection.Output);

AddWithValueの間違った使い方e. 2 番目のパラメーターは、方向の種類ではなく、パラメーター値として解析されます。適切なパラメーター コンストラクターを使用し、結果をコレクションに追加します。

于 2013-11-12T13:38:18.770 に答える
0

すでに対応しているかもしれませんが、念のため、C#コードでパラメータの方向を指定してください。

于 2013-11-12T13:44:35.170 に答える