2016-06-15 9 views
1

データベースに15メートルの読みを挿入する以下のストアドプロシージャがあります。挿入処理中にエラーがなければ、このプロシージャは正常に機能します。私が問題を横切って走っているところは、重複レコードが誤って挿入されている(PK制約に違反している)場合です。その場合、文は終了し、@InsertSuccess変数は適切に設定されません。ここでasp.net sql serverストアドプロシージャが終了したかどうかを確認する方法

はストアドプロシージャです:

CREATE PROCEDURE [dbo].[sp_insert_meter_readings] 
    -- Add the parameters for the stored procedure here 
    @DateTime datetime, 
    @MainCityMeasValue float, 
    @ReheatMeterMeasValue float, 
    @CasterOilMeasValue float, 
    @MillCityMeasValue float, 
    @NumOneMeterMeasValue float, 
    @NumTwoMeterMeasValue float, 
    @NumThreeMeterMeasValue float, 
    @NumSixMeterMeasValue float, 
    @MillWellMeasValue float, 
    @MainWellMeasValue float, 
    @SprayMakeUpMeasValue float, 
    @MachMakeUpMeasValue float, 
    @NumFiveCitySprayMakeUpMeasValue float, 
    @NumFiveCityMachMakeUpMeasValue float, 
    @NumFiveBlowDownMeasValue float, 
    @InsertSuccess int output 

AS 
BEGIN 
    DECLARE 
    @MainWellMeasNum AS INT = 42, 
    @MainCityMeasNum AS INT = 43, 
    @NumOneMeterMeasNum AS INT = 45, 
    @NumTwoMeterMeasNum AS INT = 44, 
    @NumThreeMeterMeasNum AS INT = 46, 
    @NumSixMeterMeasNum AS INT = 47, 
    @ReheatMeterMeasNum AS INT = 49, 
    @MillWellMeasNum AS INT = 50, 
    @MillCityMeasNum AS INT = 258, 
    @SprayMakeUpMeasNum AS INT = 348, 
    @MachMakeUpMeasNum AS INT = 349, 
    @NumFiveCityMachMakeUpMeasNum AS INT = 372, 
    @NumFiveCitySprayMakeUpMeasNum AS INT = 373, 
    @NumFiveBlowDownMeasNum AS INT = 374, 
    @CasterOilMeasNum AS INT = 436 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    INSERT INTO MainTable VALUES (@DateTime, @MainCityMeasNum, @MainCityMeasValue), 
          (@DateTime, @ReheatMeterMeasNum, @ReheatMeterMeasValue), 
          (@DateTime, @CasterOilMeasNum, @CasterOilMeasValue), 
          (@DateTime, @MillCityMeasNum, @MillCityMeasValue), 
          (@DateTime, @NumOneMeterMeasNum, @NumOneMeterMeasValue), 
          (@DateTime, @NumTwoMeterMeasNum, @NumTwoMeterMeasValue), 
          (@DateTime, @NumThreeMeterMeasNum, @NumThreeMeterMeasValue), 
          (@DateTime, @NumSixMeterMeasNum, @NumSixMeterMeasValue), 
          (@DateTime, @MillWellMeasNum, @MillWellMeasValue), 
          (@DateTime, @MainWellMeasNum, @MainWellMeasValue), 
          (@DateTime, @SprayMakeUpMeasNum, @SprayMakeUpMeasValue), 
          (@DateTime, @MachMakeUpMeasNum, @MachMakeUpMeasValue), 
          (@DateTime, @NumFiveCitySprayMakeUpMeasNum, @NumFiveCitySprayMakeUpMeasValue), 
          (@DateTime, @NumFiveCityMachMakeUpMeasNum, @NumFiveCityMachMakeUpMeasValue), 
          (@DateTime, @NumFiveBlowDownMeasNum, @NumFiveBlowDownMeasValue) 

    IF @@ROWCOUNT = 15 
    SET @InsertSuccess = 1 
    ELSE 
    SET @InsertSuccess = 0 

END 

そして、誰かがそれを必要とするだけの場合には、ここに私のコードが背後にある:

int insertSuccess; 

      SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); 
      con.Open(); 

     using (SqlCommand com = new SqlCommand("sp_insert_meter_readings", con)) 
     { 
      com.CommandType = System.Data.CommandType.StoredProcedure; 
      com.Parameters.Add(new SqlParameter("@DateTime", Session["curShift"])); 
      com.Parameters.Add(new SqlParameter("@MainCityMeasValue", Session["mainCityMeter"])); 
      com.Parameters.Add(new SqlParameter("@ReheatMeterMeasValue", Session["reheatMeter"])); 
      com.Parameters.Add(new SqlParameter("@CasterOilMeasValue", Session["casterOilMeter"])); 
      com.Parameters.Add(new SqlParameter("@MillCityMeasValue", Session["millCityMeter"])); 
      com.Parameters.Add(new SqlParameter("@NumOneMeterMeasValue", Session["numOneMeter"])); 
      com.Parameters.Add(new SqlParameter("@NumTwoMeterMeasValue", Session["numTwoMeter"])); 
      com.Parameters.Add(new SqlParameter("@NumThreeMeterMeasValue", Session["numThreeMeter"])); 
      com.Parameters.Add(new SqlParameter("@NumSixMeterMeasValue", Session["numSixmeter"])); 
      com.Parameters.Add(new SqlParameter("@MillWellMeasValue", Session["millWellMeter"])); 
      com.Parameters.Add(new SqlParameter("@MainWellMeasValue", Session["mainWellMeter"])); 
      com.Parameters.Add(new SqlParameter("@SprayMakeUpMeasValue", Session["sprayMakeUpWellMeter"])); 
      com.Parameters.Add(new SqlParameter("@MachMakeUpMeasValue", Session["machMakeUpWellMeter"])); 
      com.Parameters.Add(new SqlParameter("@NumFiveCitySprayMakeUpMeasValue", Session["numFiveCitySprayMakeUpMeter"])); 
      com.Parameters.Add(new SqlParameter("@NumFiveCityMachMakeUpMeasValue", Session["numFiveMachMakeUpMeter"])); 
      com.Parameters.Add(new SqlParameter("@NumFiveBlowDownMeasValue", Session["numFiveBlowDownMeter"])); 

      var returnParam1 = new SqlParameter 
      { 
       ParameterName = "@InsertSuccess", 
       Direction = System.Data.ParameterDirection.Output, 
       SqlDbType = System.Data.SqlDbType.Int 
      }; 
      com.Parameters.Add(returnParam1); 
      com.ExecuteNonQuery(); 

      insertSuccess = (int)com.Parameters["@InsertSuccess"].Value; 

      if (insertSuccess == 1) 
      { 
       MessageLabel.ForeColor = System.Drawing.Color.DarkGreen; 
       MessageLabel.Text = "Insert Successful."; 
      } 
      else 
      { 
       MessageLabel.ForeColor = System.Drawing.Color.Red; 
       MessageLabel.Text = "There was an error with the insert."; 
      } 


      con.Close(); 
     } 

デバッグするとき、私はSPがで終端されていることがわかりますcom.ExecuteNonQuery()行と私のコードは、insertSuccess =(int)com.Parameters ["@ InsertSuccess"]に進まない。私のメッセージは決してユーザーに表示されません。

私の研究では、SPの@@ ROWCOUNTブロックを使用してSPからメッセージを返す方法しか示されていませんでした。

他の提案はありますか?

おかげ

+0

サイドノート:ストアドプロシージャのプレフィックス 'sp_'を使用しないでください**。マイクロソフトは、[*ストアドプロシージャの名前付け*を参照してください](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx)、およびあなたはいつか名前衝突のリスクを将来実行します。 [ストアドプロシージャのパフォーマンスにも悪い](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)単に 'sp_'を避け、他の何かを接頭辞として使うのが最善です。 –

+0

うわー、ありがとう。私は今まで知らなかった;今私は改名のトンを持っています。 – CuriousOne

答えて

1

あなたはいつもそれからの戻り値を取得するようにtry catchブロックを含めるように、ストアドプロシージャを変更します。

CREATE PROCEDURE [dbo].[sp_insert_meter_readings] 
-- Add the parameters for the stored procedure here 
@DateTime datetime, 
@MainCityMeasValue float, 
@ReheatMeterMeasValue float, 
@CasterOilMeasValue float, 
@MillCityMeasValue float, 
@NumOneMeterMeasValue float, 
@NumTwoMeterMeasValue float, 
@NumThreeMeterMeasValue float, 
@NumSixMeterMeasValue float, 
@MillWellMeasValue float, 
@MainWellMeasValue float, 
@SprayMakeUpMeasValue float, 
@MachMakeUpMeasValue float, 
@NumFiveCitySprayMakeUpMeasValue float, 
@NumFiveCityMachMakeUpMeasValue float, 
@NumFiveBlowDownMeasValue float, 
@InsertSuccess int output 

AS 
BEGIN 
DECLARE 
@MainWellMeasNum AS INT = 42, 
@MainCityMeasNum AS INT = 43, 
@NumOneMeterMeasNum AS INT = 45, 
@NumTwoMeterMeasNum AS INT = 44, 
@NumThreeMeterMeasNum AS INT = 46, 
@NumSixMeterMeasNum AS INT = 47, 
@ReheatMeterMeasNum AS INT = 49, 
@MillWellMeasNum AS INT = 50, 
@MillCityMeasNum AS INT = 258, 
@SprayMakeUpMeasNum AS INT = 348, 
@MachMakeUpMeasNum AS INT = 349, 
@NumFiveCityMachMakeUpMeasNum AS INT = 372, 
@NumFiveCitySprayMakeUpMeasNum AS INT = 373, 
@NumFiveBlowDownMeasNum AS INT = 374, 
@CasterOilMeasNum AS INT = 436 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
BEGIN TRY 
INSERT INTO MainTable VALUES (@DateTime, @MainCityMeasNum, @MainCityMeasValue), 
         (@DateTime, @ReheatMeterMeasNum, @ReheatMeterMeasValue), 
         (@DateTime, @CasterOilMeasNum, @CasterOilMeasValue), 
         (@DateTime, @MillCityMeasNum, @MillCityMeasValue), 
         (@DateTime, @NumOneMeterMeasNum, @NumOneMeterMeasValue), 
         (@DateTime, @NumTwoMeterMeasNum, @NumTwoMeterMeasValue), 
         (@DateTime, @NumThreeMeterMeasNum, @NumThreeMeterMeasValue), 
         (@DateTime, @NumSixMeterMeasNum, @NumSixMeterMeasValue), 
         (@DateTime, @MillWellMeasNum, @MillWellMeasValue), 
         (@DateTime, @MainWellMeasNum, @MainWellMeasValue), 
         (@DateTime, @SprayMakeUpMeasNum, @SprayMakeUpMeasValue), 
         (@DateTime, @MachMakeUpMeasNum, @MachMakeUpMeasValue), 
         (@DateTime, @NumFiveCitySprayMakeUpMeasNum, @NumFiveCitySprayMakeUpMeasValue), 
         (@DateTime, @NumFiveCityMachMakeUpMeasNum, @NumFiveCityMachMakeUpMeasValue), 
         (@DateTime, @NumFiveBlowDownMeasNum, @NumFiveBlowDownMeasValue) 

SET @InsertSuccess = 1 

END TRY 
BEGIN CATCH 

SET @InsertSuccess = 0   

END CATCH 
END 
+0

ありがとうございました。私は許可されるとすぐに、これを受け入れられた回答としてマークします。おかげさまで、私はT-SQLのTRY CATCHを知らなかったのです。 – CuriousOne

+0

あなたは大歓迎です:)助けて嬉しいです! – mituw16

関連する問題