vb.net - OleDbException no se ha manejado... Error de sintaxis en la instrucción UPDATE
(1)
Deberías usar los parámetros de SQL. Esto no solo simplificará su código, sino que hará que ciertos tipos de errores sean menos probables y protegerá contra los ataques de inyección SQL:
Dim sql = <sql>
UPDATE tblPatientsRecord SET [Names] = @p1,
Licensenumber = @p2,
Address = @p3,
Fullname = @p4,
Birthday = @p5,
[Age] = @p6,
Country = @p7
WHERE PatientID = @p8
</sql>.Value
Using conn = New OleDbConnection(myConnStr),
cmd As New OleDbCommand(sql, conn)
conn.Open()
cmd.Parameters.Add("@p1", OleDbType.VarChar).Value = txtNames.Text
cmd.Parameters.Add("@p2", OleDbType.VarChar).Value = txtLicensenumber.Text
'' ...etc
cmd.Parameters.Add("@p6", OleDbType.Integer).Value = intVar
''the last one is the WHERE
cmd.Parameters.Add("@p8", OleDbType.VarChar).Value = Convert.ToInt32(lblPatientID.Text)
cmd.ExecuteNonQuery()
''... etc
End Using
Hay varios otros problemas comúnmente vistos que deben ser atendidos.
Los objetos DBConnection están destinados a ser creados, utilizados y desechados en lugar de ser utilizados una y otra vez. Sin embargo, puede usar una cadena de conexión global o crear una función para devolver una nueva conexión, por lo que no tiene la misma cadena de conexión en cualquier lugar. Vea esta respuesta para un ejemplo de este último.
Muchos de los DBObjects deben eliminarse .
Using
bloques se cerrará y eliminará la conexión y los objetos de comando. En general, si algo tiene el métodoDispose
, envuélvalo en un bloqueUsing
. Lo anterior muestra cómo "apilar" 2 objetos (OleDbConnection
yOleDbCommand
) en una sola declaraciónUsing
.Use el método
Add
lugar deAddWithValue
. Esto le permite especificar el tipo de datos para cada parámetro y evitar errores de tipo deDatatype mismatch
cuando su código proporciona valores de texto para columnas numéricas o de fecha.La cláusula
WHERE
es solo otro parámetro . A menudo las personas usarán parámetros para la primera parte del SQL pero concatenarán la cláusula WHERE innecesariamente.Lo anterior también usa un literal XML para construir el SQL. Esto es útil para SQL largo y complejo, ya que puede formatearlo e indentificarlo a su gusto. También puede usar varias líneas para que sea legible:
Dim sql = "UPDATE tblPatientsRecord SET [Names] = @p1, " _ & "Licensenumber = @p2, " _ & "Address = @p3, "
Si utiliza palabras reservadas de SQL o espacios en nombres de tabla o columna, debe escapar de los nombres usando
[Square Brackets]
como se muestra. Lo mejor es no usar ninguno de los nombres.User
,Names
Password
yValues
son palabras comúnmente usadas como nombres de columnas o tablas que resultan en errores de sintaxis SQL.Los ticks no son delimitadores de campo SQL de uso múltiple, en realidad indican que el valor que se pasa es string / text:
& "Age =''" & txtAge.Text & "''"
. Si la base de datos está configurada para almacenarAge
como un número, su SQL lo pasa como texto / cadena, lo que puede ocasionar unadata type mismatch
. Lo mismo es cierto dePatientID
yBirthday
si se trata de un campo de fecha.Un problema común para concatenar cadenas para una sentencia de SQL es demasiadas o muy pocas marcas (
''
) en el resultado. Esto no puede suceder con los parámetros de SQL.
Sin embargo, el propósito principal de los Parámetros SQL es evitar un error si el nombre es "O''Brian" o "O''Reilly" o "Bobby"; DROP TABLE tblPatientsRecord "
Estos principios se aplican a otros proveedores de MySql
como MySql
, SQLite
y SQLServer
. Sin embargo, los detalles, como el carácter de escape exacto, variarán.
Tenga en cuenta que Access / OleDB no usa parámetros nombrados como tales ( @FirstName
o incluso @p2
), por lo que a menudo verá los parámetros en forma de "?". Esto significa que debe agregar los valores de los parámetros ( Add
/ AddWithValue
) en el mismo orden exacto en que aparecen esas columnas en el SQL.
Para más información, ver:
Recibo ese error cuando depuro, por favor alguien puede ayudarme ... A continuación se muestra el código:
Private Sub UpdateToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UpdateToolStripMenuItem.Click
If MsgBox("Save Changes?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "WARNING") = MsgBoxResult.Yes Then
Dim oleDC As New OleDbCommand
With oleDC
.Connection = conn
.CommandText = "UPDATE tblPatientsRecord SET Names=''" & txtNames.Text & _
"'',Licensenumber=''" & txtLicensenumber.Text & _
"'',Address=''" & txtAddress.Text & _
"'',Fullname=''" & txtFullname.Text & _
"'',Birthday=''" & txtBase.Text &
"'',Age=''" & txtAge.Text & _
"'',Country=''" & cmbCountry.Text & "'' WHERE PatientID=''" & txtPatientID.Text & "''"
.ExecuteNonQuery()
MsgBox("Record Updated!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "SUCCESS")
Disable()
Clear()
SaveToolStripMenuItem.Enabled = False
NewToolStripMenuItem.Enabled = True
LoadPatientsRecord()
getLastPatientID()
End With
End If
End Sub
ayuda por favor