Estoy realizando un pequeño sistema en vb.net 2010 y me recomendaron trabajar con transacciones al momento de insertar registros a la BD, ya que estoy trabajando con un Datagrid que me importa los registros desde excel y luego me los guarda en la BD a traves de un boton... Actualmente si le doy al boton guardar y hay algun campo clave repetido me da el error pero igual almacena los registros anteriores al campo clave repetido... lo que quiero es que no se guarden los registros si hay cualquier tipo de error durante el almacenamiento...
Ahora les coloco el codigo de como estoy trabajando con las transacciones las cuales no me esta dando resultado ya que igual almacena los registros si hay error.
Código:
Imports System.Data.OleDb 'Importacion necesaria para trabajar con ficheros excel Public Class frmInclusiondiario Dim myTrans As MySqlTransaction 'EVENTO CLICK DEL BOTON XLS Private Sub btnXLS_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnXLS.Click 'Instanciamos nuestro cuadro de dialogo Dim openFileDialog1 As New OpenFileDialog 'Directorio Predeterminado openFileDialog1.InitialDirectory = "C:\" 'Filtramos solo archivos con extension *.xls openFileDialog1.Filter = "Archivos de Microsoft Office Excel (*.xls)|*.xls" 'Si se presiona abrir entonces... If openFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then 'Asignamos la ruta donde se almacena el fichero excel que se va a importar txtRutaXLS.Text = openFileDialog1.FileName 'Instanciamos nuestra cadena de conexion especial para excel,indicando la ruta del fichero Dim cadconex As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Me.txtRutaXLS.Text.Trim & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""" Dim cn As New OleDb.OleDbConnection(cadconex) Dim cmd As New OleDbCommand Dim da As New OleDb.OleDbDataAdapter Dim dt As New DataTable cmd.Connection = cn 'Consultamos la hoja llamada Sheet de nuestro archivo *.xls cmd.CommandText = "select * from [Sheet1$]" cmd.CommandType = CommandType.Text da.SelectCommand = cmd 'Llenamos el datatable da.Fill(dt) 'Llenamos el Datagridview dgvImportacion.DataSource = dt 'Ajustamos las columnas del DataGridView dgvImportacion.AutoSizeColumnsMode = 6 End If End Sub Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click Me.Visible = False Me.Dispose() frmMenu.Show() End Sub Private Sub btnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGuardar.Click Dim cn As New MySqlConnection(frmConexion.ConexionMySQL) cn.Open() Try myTrans = cn.BeginTransaction() Dim sqli As String = "INSERT INTO operaciones (no,campo1, campo2,campo3) VALUES (@no,@campo1,@campo2,@campo3)" Dim cmd As New MySqlCommand(sqli, cn) Dim no As Integer = 0 'Recorremos el Datagridview For Each fila As DataGridViewRow In dgvImportacion.Rows cmd.Parameters.Clear() no += 1 'Dependiendo del Datagrid se colocan las filas cmd.Parameters.AddWithValue("@no", no) cmd.Parameters.AddWithValue("@campo1", fila.Cells(0).Value) cmd.Parameters.AddWithValue("@campo2", fila.Cells(2).Value) cmd.Parameters.AddWithValue("@campo3", fila.Cells(3).Value) 'Ejecutar instruccion sql Insert cmd.ExecuteNonQuery() myTrans.Commit() Next MessageBox.Show("Registros Ingresados con Exito...") Catch ex As Exception myTrans.Rollback() 'Anunciamos el error si lo hay MsgBox(ex.Message.ToString) MsgBox("No se pudo cargar a la base de datos") cn.Close() End Try End Sub End Class