【问题标题】:prevent duplicate entries to database防止重复输入数据库
【发布时间】:2016-11-08 03:14:11
【问题描述】:

我想使用 vb.net 和 MySQL 作为数据库来防止我的库存表单出现重复条目​​,这是我的代码:

 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    Dim myCommand As New MySqlCommand
    Dim conn As MySqlConnection
    Dim i As String
    conn = New MySqlConnection
    conn.ConnectionString = "server = localhost;username= root;password= a;database= secret"
    Try
        conn.Open()
    Catch mali As MySqlException
        MsgBox("connot establish connection")
    End Try

    Dim intReturn As Integer
    Dim strSql As String = " select * from personnel where pcode = @pcode"

    Dim sqlcmd As New MySqlCommand(strSql, conn)
    With sqlcmd.Parameters
        .AddWithValue("@pcode", CType(pcode.Text, String))
    End With

    intReturn = sqlcmd.ExecuteScalar

    If (intReturn > 0) Then
        cmd = New MySqlCommand("Insert into personnel values('" & pcode.Text & "','" & lname.Text & "','" & fname.Text & "','" & office.Text & "','" & designation.Text & "')")
        i = cmd.ExecuteNonQuery


        If pcode.Text <> "" Then
        ElseIf i > 0 Then
            MsgBox("Save Successfully!", MessageBoxIcon.Information, "Success")
            mrClean()
            ListView1.Tag = ""
            Call objLocker(False)
            Call LVWloader()
            Call calldaw()
        Else
            MsgBox("Save Failed!", MessageBoxIcon.Error, "Error!")
        End If
    Else
        MsgBox("Personnel ID Already Exist!", MessageBoxIcon.Error, "Error!")

    End If

结束子

我在搜索答案时发现了这个,但是当我尝试运行它时,它不会读取插入命令,而是直接进入 msbox“人员 ID 已存在”,即使没有相同的人员 ID。

有人可以检查一下为什么它不阅读插入,

我的数据库表值:

pcode = 主键

lname = 长文本

fname = 长文本

office = 长文本

名称 = 长文本

任何帮助将不胜感激,谢谢,

【问题讨论】:

  • 我认为您的查询应该是select count(*) from personnel where pcode = @pcode,因为您似乎想检查您的命令是否返回了行
  • 尝试使用计数,但在 intReturn = sqlcmd.ExecuteScalar 声明时出现新错误,

标签: mysql vb.net validation


【解决方案1】:

很抱歉,这是错误的做法。

数据库有一个内置系统来防止数据被复制。那是通过主键或唯一键约束。在您的情况下,您已经创建了一个主键。因此,您绝对不需要进行 SELECT COUNT(*) 查询。

相反,直接插入到表中,当 pcode 已经存在时捕获完整性错误。

Try
    cmd = New MySqlCommand("Insert into personnel values('" & pcode.Text & "','" & lname.Text & "','" & fname.Text & "','" & office.Text & "','" & designation.Text & "')")

    i = cmd.ExecuteNonQuery


    If pcode.Text <> "" Then
    ElseIf i > 0 Then
        MsgBox("Save Successfully!", MessageBoxIcon.Information, "Success")
        mrClean()
        ListView1.Tag = ""
        Call objLocker(False)
        Call LVWloader()
        Call calldaw()
    Else
        MsgBox("Save Failed!", MessageBoxIcon.Error, "Error!")
    End If
Catch ex As MySqlException
    MsgBox("Personnel ID Already Exist!", MessageBoxIcon.Error, "Error!")
End Try

另请参阅 MySQL 手册页PRIMARY KEY and UNIQUE Index Constraints

【讨论】:

  • 谢谢先生,其实我已经做了一个代码直接插入到表中,但我只是不知道如何捕捉错误,它总是出现在代码上,我只希望它出现在消息框,谢谢,
【解决方案2】:

应该有你的方式:

1)在Insert之前写一个Trigger,并检查是否存在任何类似的行。
2)在列上放置唯一索引

【讨论】:

  • 绝对不需要为此触发。
【解决方案3】:

找到了答案,正如@e4c5所说,这是一种错误的方法,所以我重构了我的代码并最终使它工作,只是想分享答案,也许它会帮助别人。

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim myCommand As New MySqlCommand
Dim conn As MySqlConnection
Dim i As String
conn = New MySqlConnection
conn.ConnectionString = "server = localhost;username= root;password= a;database= secret"
Try
    conn.Open()
Catch mali As MySqlException
    MsgBox("connot establish connection")
End Try
    Dim retval As String
    Select Button4.Tag
            Case "ADD"
    with myCommand
       .Connection = conn
       .CommandText = "Select pcode from personnel where pcode = '" & pcode.Text & "'"
        retval = .ExecuteScalar
    If retval Is Nothing Then
      .CommandText = "Insert into personnel values ('" & pcode.Text & "','" & lname.Text & "','" & fname.Text & "','" & office.text & "','" & designation.Text & "')"
      .ExecuteNonQuery()
  Else
  MsgBox("Personnel ID Already Exist!", MessageBoxIcon.Error, "Error")
 End If
End With
End Sub

【讨论】:

  • 很抱歉说错了,因为您仍在进行选择,然后插入。请务必阅读 vb.net 中的异常处理以及数据库竞争条件
  • 我想知道为什么它对我有用,它会检测 pcode 重复并在 pcode 唯一时保存数据,
  • 它有效,但这不是正确的答案。就像我说的那样,您需要了解数据库竞争条件。您的代码不处理竞争条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 2012-03-11
  • 2014-02-08
相关资源
最近更新 更多