vb.net

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.

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

  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 "apilar" 2 objetos ( OleDbConnection y OleDbCommand ) en una sola declaración Using .

  3. Use el método Add lugar de AddWithValue . Esto le permite especificar el tipo de datos para cada parámetro y evitar errores de tipo de Datatype mismatch cuando su código proporciona valores de texto para columnas numéricas o de fecha.

  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 sintaxis 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:

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