データベースに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からメッセージを返す方法しか示されていませんでした。
他の提案はありますか?
おかげ
サイドノート:ストアドプロシージャのプレフィックス '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_'を避け、他の何かを接頭辞として使うのが最善です。 –
うわー、ありがとう。私は今まで知らなかった;今私は改名のトンを持っています。 – CuriousOne