Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用vb.net停止在表中插入相同的记录_Vb.net - Fatal编程技术网

如何使用vb.net停止在表中插入相同的记录

如何使用vb.net停止在表中插入相同的记录,vb.net,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 A

我正在使用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 = "admin@userpoint.com"
                SendEmail.SendMessage(subject, message, from, email, "")
            Next
        Catch ex As Exception

        End Try
    End Sub
如果用户试图在数据库表的这两列上插入具有相同CourseID和CPUserID的相同记录,我想抛出异常。如果您尝试插入重复项,将返回异常

CREATE UNIQUE INDEX IDX_Course_UserId_Delegate
     ON Delegate (CourseID,CPUserID) 
或者将Sp更改为先检查

或者在DB上添加一个insert触发器,该触发器将引发异常

好的,我来接你

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

实际上有两个选项-首先查询表以查看该行是否存在,然后抛出一个自定义异常,将整个事务包装到事务中,或者在DB中使用唯一的约束/索引强制执行此操作。无论如何,您都应该这样做。然后,当您尝试插入时,DB将发回一个错误…

而不是让它引发异常。您可以更改存储过程uspInsertDelegate,在尝试执行插入之前检查该行是否已存在,并报告它是否执行了该操作


为了安全起见,我也会像Preet所说的那样在数据库中创建唯一的索引。

亲爱的,但是我可以有许多课程id,它们具有不同的cpuserid,这没关系。以上只是意味着只允许具有两个值的唯一行,允许任何其他排列。我在sql server进程中控制这一点,只是如果用户尝试插入相同的记录,我想抛出异常消息我已在两个列上创建了唯一索引,除了在我的过程中使用IF NOT EXISTS SELECT*FROM tblDelegate在插入前CourseID=@CourseID和CPUserID=@CPUserID外,现在我应该如何向用户显示无法插入记录的消息,因为它已经存在于表中检查此问题: