Buenas
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