2009-09-07 2 views
1

VB.NET과 아래의 코드를 버튼 클릭 이벤트에서 사용하고 있습니다.vb.net을 사용하여 테이블에 같은 레코드를 삽입하는 것을 중지하는 방법

Protected Sub ibtnSendInvites_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles ibtnSendInvites.Click 
     Try 
      Dim emailList As New List(Of String) 
      Dim conString As String = WebConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString 
      Dim con As New SqlConnection(conString) 
      con.Open() 
      Dim cmd As SqlCommand 
      For Each curRow As GridViewRow In GridView1.Rows 
       Dim chkSelect As CheckBox = CType(curRow.Cells(1).FindControl("chkSelect"), CheckBox) 
       Dim emailLabel As Label = CType(curRow.Cells(1).FindControl("lblEmailAddress"), Label) 
       If chkSelect.Checked Then 
        emailList.Add(emailLabel.Text) 
        cmd = New SqlCommand("uspInsertDelegate", con) 
        cmd.CommandType = CommandType.StoredProcedure 
        cmd.Parameters.Add("@CourseID", SqlDbType.Int).Value = Session("CourseID") 
        cmd.Parameters.Add("@CPUserID", SqlDbType.Int).Value = CType(curRow.Cells(1).FindControl("lblCPUserID"), Label).Text 
        cmd.Parameters.Add("@StatusID", SqlDbType.Int).Value = 25 
        cmd.Parameters.Add("@CreateUser", SqlDbType.VarChar).Value = Session("LoggedInUser") 
        cmd.ExecuteNonQuery() 
       End If 
      Next 
      For Each email As String In emailList 
       Dim message As String = "Please confirm your booking " 
       Dim subject As String = "UserPoint Course Booking Invitation Email" 
       Dim from As String = "[email protected]" 
       SendEmail.SendMessage(subject, message, from, email, "") 
      Next 
     Catch ex As Exception 

     End Try 
    End Sub 

나는 사용자가 및 CPUserID 같은 기록을 가진 같은 CourseID를 삽입하려고하면 예외를 throw합니다.

+0

이 질문을 확인하십시오 : [레코드가 이미있는 경우 테이블에 삽입 중지] (http://stackoverflow.com/questions/1388235/stop-inserting-in-table-if-record-already-exists) – Shoban

답변

2

Put a unique index이 두 열의 데이터베이스 테이블에 있습니다. 중복을 삽입하려고하면 예외가 다시 발생합니다.

CREATE UNIQUE INDEX IDX_Course_UserId_Delegate 
    ON Delegate (CourseID,CPUserID) 

또는 첫번째

를 확인하거나 인상 및 예외 것이다 DB에 삽입 트리거를 추가 할 수있는 SP를 변경합니다.

Throw New Exception("CANNOT INSERT DUPLICATE TROW", ex) 
+0

감사합니다. 위의 코드를 사용하여 예제 코드를 만들 수 있습니까? –

+0

친애하는하지만 다른 코스 ID와 다른 cpuserid를 가질 수 있습니다. 그 반대의 경우 –

+0

그게 전부입니다. 위의 내용은 두 값을 가진 유일한 행만 허용되며 다른 순열은 허용된다는 것을 의미합니다. –

0

두 가지 옵션 정말 캐치에

확인 - 행이 존재하는지 확인하고 사용자 정의 예외 (트랜잭션의 모든 것을 포장)를 던져, 또는,이를 시행 먼저 테이블을 쿼리 고유 한 제약 조건/인덱스가있는 DB (어쨌든이 작업을 수행해야합니다). DB를 시도하면 다시 오류가 발생합니다 ...

+0

고마워요!, 위의 코드를 사용할 수 있습니까? 암호? –

+0

도와 주셔서 감사합니다. –

1

대신 삽입을 시도하기 전에 행이 이미 있는지 확인하기 위해 저장 프로 시저 "uspInsertDelegate"를 변경할 수 있습니다. 그것을했는지 여부를 다시보고하십시오.

Preet이 말한대로 데이터베이스에 고유 한 색인을 만들려고합니다. 단지 안전한 곳에 있어야합니다.

+0

고유 한 인덱스를 두 열에 모두 만들었지 만 존재하지 않는 IF NOT을 사용하여 내 proc에서 확인했습니다 (SELECT * FROM tblDelegate CourseID = @CourseID 및 CPUserID = @CPUserID). 삽입하기 전에 메시지를 어떻게 표시해야합니까? 테이블에 이미있는 레코드를 삽입 할 수 없다는 것을 사용자에게 알립니다. –

관련 문제