validar repitan registros que optimizar lentas evitar duplicados datos consultas mysql vb.net validation

repitan - optimizar consultas lentas mysql



prevenir entradas duplicadas a la base de datos (3)

Quiero evitar entradas duplicadas a mi formulario de inventario usando vb.net y MySQL como la base de datos, aquí está mi código:

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

end sub

Encontré esto mientras busco la respuesta, pero cuando traté de ejecutarla, no lee el comando insert, sino que va directamente a la msbox "Person ID ID existing Exist" incluso si no hay la misma ID de personal.

alguien puede verificar por qué no lee el inserto,

mis valores de tablas de base de datos:

pcode = clave principal

lname = longtext

fname = longtext

oficina = texto largo

designación = texto largo

cualquier ayuda será muy apreciada, gracias,


Perdón por decir que este es el enfoque equivocado.

Las bases de datos tienen un sistema incorporado para evitar que los datos se dupliquen. Eso es a través de claves primarias o restricciones de clave únicas. En su caso, ya ha creado una clave principal. Por lo tanto, no es necesario que haga esa consulta SELECT COUNT(*) .

En su lugar, simplemente inserte directamente en la tabla y atrape el error de integridad cuando el código p ya existe.

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

Consulte también la Página manual de MySQL PRIMARY KEY y las restricciones de índice UNIQUE


Debe haber la forma en que usted:

1) escriba un disparador antes de Insertar y compruebe si existe alguna fila similar.
2) Ponga índice único en las columnas


encontré la respuesta, como dijo @ e4c5, es un enfoque equivocado, así que reestructuré mi código y finalmente lo hice funcionar, solo quiero compartir la respuesta, tal vez ayudará a otros.

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