2014-07-22 2 views
1

저장 프로 시저에서 항목을 한 번 복제해야하지만 두 개의 복제 된 레코드가 생성됩니다.SQL Server 저장 프로 시저가 두 개의 레코드를 삽입하는 중

내 C# 프로그램에는이 메서드를 호출하는 단추가 있습니다. 디버깅은 한 번만 불이 있고 2 복제 된 항목의 neweventid

protected void cloneEvent(object sender, EventArgs e) 
{ 
     using (SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["AppConnection"].ConnectionString)) 
     { 
      using (SqlCommand myCommand = new SqlCommand("addRecycleEventAcceptedMaterialsClone")) 
      { 
       //object returnValue; 

       myCommand.CommandType = CommandType.StoredProcedure; 
       myCommand.Connection = myConnection; 
       myCommand.Parameters.AddWithValue("@event_id", qsEventId); 
       myConnection.Open(); 
       myCommand.ExecuteNonQuery(); 

       //returnValue = myCommand.ExecuteScalar(); 
       NewEventID = (int)myCommand.ExecuteScalar(); 
      } 
     } 
     Response.Redirect("eventDetail.aspx?eventid=" + NewEventID); 
    } 

내가 확인하고 기본 키/ID 열을

ALTER PROCEDURE [dbo].[addRecycleEventAcceptedMaterialsClone] 
    -- Add the parameters for the stored procedure here 
    --Pass in the original event_id 
    @event_id int 
    [email protected]_id INT OUTPUT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    INSERT INTO RECYCLE_EVENT (event_nm, start_dt, end_dt, start_tm, end_tm, 
           website_ad, address_ad, city_nm, state_cd, zip_cd, 
           county_id, description_ds, moreinfo_ds, 
           latitude, longitude, phone_nr) 
    SELECT 
     event_nm, start_dt, end_dt, start_tm, end_tm, 
     website_ad, address_ad, city_nm, state_cd, zip_cd, 
     county_id, description_ds, moreinfo_ds, 
     latitude, longitude, phone_nr 
    FROM 
     RECYCLE_EVENT 
    WHERE 
     event_id = @event_id 

    --SET @newEvent_id = IDENT_CURRENT('RECYCLE_EVENT');  
    --SELECT @newEvent_id = SCOPE_IDENTITY() 
     SELECT CAST(scope_identity() AS int); 
    --SELECT @newEvent_id AS newEventID 

--NEW CLONED EVENT HAS BEEN ADDED AND A NEW ID (newEventID) has been generated. 
--NOW INSERT all materials accepted for the @event_id and insert them into the RECYCLER_EVENT_MATERIALS_ACCEPTED table 
--Give it the newEventID 

INSERT INTO RECYCLER_EVENT_MATERIALS_ACCEPTED ( 
     event_id, 
     material_type_id, 
     acceptance_cd, 
     residential_fl, 
     commercial_fl, 
     service_type_cd, 
     end_dt, 
     event_material_cloned_id 
     ) 
     SELECT 
     IDENT_CURRENT('RECYCLE_EVENT'), 
     material_type_id, 
     acceptance_cd, 
     residential_fl, 
     commercial_fl, 
     service_type_cd, 
     end_dt, 
     event_material_id 
     FROM RECYCLER_EVENT_MATERIALS_ACCEPTED 
     where event_id = @event_id 

     --Grab all the records that have the old event_material_id 
     --insert a new row using the same county id and the new event_material_id 
     --eventid-76: material-id's: 18, 21, 22 
     --eventid-124: material-id's: 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 

     INSERT INTO RECYCLER_EVENT_COUNTY_SERVED (
      county_id, 
      event_material_id) 
      SELECT s.county_id, a.event_material_id 
      FROM RECYCLER_EVENT_COUNTY_SERVED s 
      INNER JOIN RECYCLER_EVENT_MATERIALS_ACCEPTED a ON s.event_material_id = a.event_material_cloned_id 

감사하다없이 중복 EVENT_ID의의 반환!

답변

5

ExecuteNonQuery을 통해 코드를 두 번 실행 한 다음 ExecuteScalar을 통해 코드를 두 번 실행하기 때문에 두 번 삽입하는 코드가 두 번 실행됩니다.

0

당신이

myCommand.ExecuteNonQuery(); 
NewEventID = (int)myCommand.ExecuteScalar(); 

가 모두 삽입 전화를 두 번 저장 프로 시저를 실행하는, 내가 첫 번째 줄을 주석 것입니다.

+0

귀하의 추천을 위해 감사합니다 bowlturner! – MSW

+0

괜찮습니다! 기꺼이 도와주세요. – bowlturner

관련 문제