2016-11-13 18 views
1

私はレコードを削除するためのストアドプロシージャを作成しました。このストアドプロシージャでは、まず削除するデータの使用状況をチェックしています。それが使用されている場合、ストアド・プロシージャーは-2を戻します。それ以外の場合は、レコードを削除します。ExecuteNonQueryは常に-1を返します

しかし、問題でも、レコードが存在しても、その代わりに-2ではなく-1が返されます。私もNOCOUNT OFFを設定しましたが、どこに問題があるのか​​分かりません。

私はこの質問はすでにNOCOUNT OFFを設定することで答えている知っているが、そのはExecuteNonQueryドキュメントから、私のため

ALTER PROCEDURE [dbo].[spDeletePIDNumber] 
    @Id int 
AS 
BEGIN 
    SET NOCOUNT OFF; 

    -- Insert statements for procedure here 
    if(exists(select * from tblBills where PID = @Id)) 
    begin 
     return -2 
    end 
    else 
    begin 
     Delete from HelperPIDNumber 
     where Id = @Id 
    end 
END 

public int DeletePIDNumber(int Id) 
{ 
     try 
     { 
      int result = 0; 

      using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.connection)) 
      { 
       var cmd = new SqlCommand("spDeletePIDNumber", conn); 
       cmd.CommandType = System.Data.CommandType.StoredProcedure; 
       cmd.Parameters.AddWithValue("@Id", Id); 

       conn.Open(); 
       result = cmd.ExecuteNonQuery(); 
      } 

      return result; 
     } 
     catch 
     { 
      throw; 
     } 
    } 
+0

試しているコードを投稿してください。 – Geethanga

+0

'.ExecuteNonQuery()' – McNets

+0

を使用しているコードを投稿し、 'Delete ,,,, 'ステートメントの下にいくつかの戻り値を追加してください。 – McNets

答えて

3

を働いていない:

が接続とリターンに対してのTransact-SQLステートメントを実行影響を受ける行の数はです。あなたの手順でSET NOCOUNT ON;を持つ

明示的に行数を返すために、SQL Serverのないに伝えます。その場合、ExecuteNonQuery関数の戻り値は-1です。

また、プロシージャーが行に影響を与えない場合は、NOCOUNTOFFの場合でも行カウントは戻されません。その場合、戻り値は-1になります。


あなたがしたいように見えるのは、ストアドプロシージャのreturn valueです。あなたはExecuteNonQueryの結果からそれを得ることはありません。 StackOverflowのこの質問を参照してください:Getting return value from stored procedure in ADO.NET

2

一般にExecuteNonQueryは、影響を受けるレコードの数を返します。 SET NOCOUNT ONが設定されている場合は

  1. :それは2例で-1を返します。あなたのコードから、その明確な、あなたはSET NOCOUNT OFFを持っているので、これはあなたのケースでは問題ではありません。

  2. 影響を受けた行の数が何もない場合は、-1を返します。あなたのケースでは、あるテーブルtblBillsからデータが存在することを確認していて、別のテーブルHelperPIDNumberから削除しているようです。したがって、一致するレコードはなく、削除される可能性はさらに高くなります。

ポイント#上記2を確認してください。

if(exists(select * from tblBills where PID = @Id)) 
begin 
    return -2 
end 
else 
begin 
    Delete from HelperPIDNumber where Id = @Id 
end 
+0

簡単に言えば、ExecuteNonQueryの戻り値はシステムの予約された値です。それを妨害しようとするべきではありません。カスタム値をSPからC#コードに戻したい場合は、出力パラメータを使用して値を抽出します。 – Geethanga

+0

@Geethangaそれは私のコードではありません:-)私はユーザーのコードをコピーし、特定のコードから可能な問題を強調表示しました – Aruna

0

代わりcmd.ExecuteNonQuery()cmd.ExecuteNonQuery()として復帰のみ影響を受けた行の数ではなく、あなたが選択されている値を使用cmd.ExecuteScalar()

+0

いいえ。ドキュメントから: 'クエリを実行し、**はクエリ**によって返された結果セットの最初の行の最初の列を返します。追加の列や行は無視されます。これは返品**の値**と同じではありません。 –

+0

'return -2'は' SELECT -1'に変更できます –

+0

OPはそれを行うことができますが、それは一般的には悪い考えです。ストアドプロシージャの場合、通常、返される結果セットは同じ形式(同じ順序の同じ列)にすることをお勧めします。 –

関連する問題