0

ストアドプロシージャを使用して電子メールで送信された重複をチェックしています

     ALTER procedure [dbo].[Insertreg]

( @id int output,@FirstName varchar (50),@LastName varchar(50) ,@Dob datetime,
    @Gender varchar(20) ,@MobileNo nchar(10) ,@Country varchar(50) ,
    @State varchar (50),@EmailId varchar (50),@Password nchar (15),@result int output

)
as 
begin

if exists(select EmailId from Profile_Master where EmailId=@EmailId)
set @result=0
else
begin
set @result=1

insert into Profile_Master(FirstName,LastName,Dob,Gender,MobileNo,Country,State,EmailId,Password)
 values 
(@FirstName,@LastName,@Dob,@Gender,@MobileNo,@Country,@State,@EmailId,@Password)
set @id=SCOPE_IDENTITY()
return
end 
end

コードビハインド

result = cmd1.Parameters.Add("@result", System.Data.SqlDbType.Int);
            result.Direction = System.Data.ParameterDirection.Output;
var id = cmd1.ExecuteNonQuery();

しかし、emailidが存在するかどうかをデバッグすると、id値が-1になります。これを解決するにはどうすればよいですか?

4

5 に答える 5

0

ExecuteNonQuery()を呼び出すと、影響を受けた行の数が返されます。outputParameterを追加したので、これにアクセスする必要があります。

// access an output parameter
cmd1.ExecuteNonQuery();
var id = cmd1.Parameters["@result"].Value;

// OR: get the returnValue of a SP
var id = cmd1.ExecuteScalar();

編集

あなたのspのこのバージョンを使用するのはどうですか

ALTER procedure [dbo].[Insertreg]
( @FirstName varchar (50),@LastName varchar(50) ,@Dob datetime,
    @Gender varchar(20) ,@MobileNo nchar(10) ,@Country varchar(50),
    @State varchar (50),@EmailId varchar (50),@Password nchar (15))
as 
begin

    if exists(select EmailId from Profile_Master where EmailId=@EmailId)
        select -1;
    else
    begin
        insert into Profile_Master(FirstName,LastName,Dob,Gender,MobileNo,Country,State,EmailId,Password)
        values (@FirstName,@LastName,@Dob,@Gender,@MobileNo,@Country,@State,@EmailId,@Password)
        select SCOPE_IDENTITY();
    end 
end

そして事後のみ使用

// no need for any output Parameters here...
int id = int.Parse(cmd1.ExecuteScalar().ToString()) 

ID値にアクセスします。指定されたメールが一意の場合、値は -1 よりも大きくなり、電子メールが既に存在する場合は -1 よりも大きくなります!

于 2012-09-14T07:12:52.383 に答える
0

id出力変数を取得するには、後で確認する必要がありIdます。ExecuteNonQueryExecuteScalarresultExecuteNonQuery

result = cmd1.Parameters.Add("@result", System.Data.SqlDbType.Int);
result.Direction = System.Data.ParameterDirection.Output;
int numberOfAffectedRecords = (int)cmd1.ExecuteNonQuery();
// now result should have the output variable

新しく作成された ID が必要な場合は、次を使用する必要がありますExecuteScalar

result = cmd1.Parameters.Add("@result", System.Data.SqlDbType.Int);
result.Direction = System.Data.ParameterDirection.Output;
int newID = (int)cmd1.ExecuteScalar();
// now result should have the output variable
于 2012-09-14T07:17:34.660 に答える
0

ExecuteNonQueryStoredProc で使用すると -1 が返されます。それが期待される動作です。

コードを次のように変更します

if exists(select EmailId from Profile_Master where EmailId=@EmailId)
   select 0 as result
else
   select 1 as result

C# では、ここでパラメーターを渡す必要はもうありません

var id = cmd1.ExecuteScalar();

OUTPUT パラメータを使用しているため、@Pilgerstorfer Franz のアプローチも使用できます。

于 2012-09-14T07:13:41.803 に答える
0

これはExecuteNonQueryの予想される動作です。クエリはどの行にも影響を与えていません。

UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドの影響を受けた行数です。挿入または更新されるテーブルにトリガーが存在する場合、戻り値には、挿入操作または更新操作の両方によって影響を受ける行の数と、トリガーまたはトリガーによって影響を受ける行の数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は -1 です。ロールバックが発生した場合、戻り値も -1 です。

次のように結果が得られます。

result = cmd1.Parameters.Add("@result", System.Data.SqlDbType.Int);
result.Direction = System.Data.ParameterDirection.Output;
cmd1.ExecuteNonQuery();
var id = result.Value;
于 2012-09-14T07:18:42.183 に答える
0

してみてください:

cmd1.ExecuteScalar();
var id=Convert.ToInt32(result.Value);
于 2012-09-14T07:21:26.437 に答える