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