OleDbException no se ha manejado … Error de syntax en la instrucción UPDATE

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

Deberías usar los parámetros de SQL. Esto no solo simplificará su código, sino que hará que ciertos tipos de errores con respecto a la syntax y los tipos de datos sean extremadamente improbables y proteja contra los ataques de inyección SQL:

 Dim sql =  UPDATE tblPatientsRecord SET [Names] = @p1, Licensenumber = @p2, Address = @p3, Fullname = @p4, Birthday = @p5, [Age] = @p6, Country = @p7 WHERE PatientID = @p8 .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 cmd.Parameters.Add("@p7", OleDbType.VarChar).Value = strVar '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.

  1. 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 para que no tenga la misma cadena de conexión en cualquier lugar.

  2. 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étodo Dispose , envuélvalo en un bloque Using . Lo anterior muestra cómo “astackr” 2 objetos ( OleDbConnection y OleDbCommand ) en una sola instrucción Using que reduce la sangría.

  3. Use el método Add lugar de AddWithValue . Esto le permite especificar el tipo de datos para cada parámetro. Sin él, el proveedor de DB debe adivinar qué puede ocasionar que el tipo de Datatype mismatch o incluso corromper la base de datos en algunos casos.

  4. 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.

  5. 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, "

  6. 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 y Values son palabras comúnmente usadas como nombres de columnas o tablas que resultan en errores de syntax SQL.

  7. 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 almacenar Age como un número, su SQL lo pasa como texto / cadena, lo que puede ocasionar una data type mismatch . Lo mismo es cierto de PatientID y Birthday 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:

  • Usando la statement
  • Agrupación de conexiones