Un saludo
Estoy intentando realizar una inserción a mi BD pero quiero hacer uso de commit y rollback estuve leyendo en varios foros buscando como hacer uso de ellos con el lenguaje VB.NET pero no estoy seguro de como realizarlo. Antes realizaba la inserción de éste modo :
Imports System.Data.SqlClient
Public Class Gestor_Ciudad
Private db As New Conexion_BD
Private Comando As SqlCommand
Public Function insert(ByVal city As Ciudad) As String
Dim i As Integer
db.Conexion.Open()
Try
Dim _sql As String = String.Format("INSERT INTO CIUDAD (codigo, nombre, fk_codigo_pais) VALUES('{0}','{1}','{2}')",
city.codigo, city.nombre, city.fk_codigo_pais)
Using cmd As New SqlCommand(_sql, db.Conexion)
i = cmd.ExecuteNonQuery
End Using
Catch ex As Exception
If Err.Description.Contains("codigo") = True Then
MsgBox("No se pudo guardar el registro, por favor intente de nuevo.", vbExclamation, "Seguridad - Ciudad")
Else
MsgBox(ex.Message, vbCritical, "Seguridad - Ciudad")
End If
db.Conexion.Close()
End Try
If i > 0 Then
Return ""
db.Conexion.Close()
Else
db.Conexion.Close()
Return "fail"
End If
End Function
End class
Teniendo mi clase conexión de éste modo :
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Public Class Conexion_BD
Protected configuracion As ConnectionStringSettings = ConfigurationManager.ConnectionStrings("cn")
Dim cn As New SqlConnection(configuracion.ConnectionString)
Public ReadOnly Property CadenaConexion As String
Get
Return cn.ConnectionString
End Get
End Property
Public ReadOnly Property Conexion As SqlConnection
Get
Return cn
End Get
End Property
End Class
Y Funciona perfectamene sin problemas, pero obviamente sin usar commits ni roollbacks. Ahora con lo que lei en otros foros, debia modificar mi clase para poder hacer uso del commit y rollback de éste modo:
Imports System.Data.SqlClient
Public Class ciudadDAO
Private db As New Conexion_BD
Private Comando As SqlCommand
Public Function insert(ByVal city As Ciudad) As String
Dim i As Integer
Dim transac As SqlTransaction
db.Conexion.Open()
transac = db.Conexion.BeginTransaction("TransactionCiudad")
Try
Dim _sql As String = String.Format("INSERT INTO CIUDAD (codigo, nombre, fk_codigo_pais) VALUES('{0}','{1}','{2}')",
city.codigo, city.nombre, city.fk_codigo_pais)
Using cmd As New SqlCommand(_sql, db.Conexion)
i = cmd.ExecuteNonQuery
transac.Commit()
End Using
Catch ex As Exception
If Err.Description.Contains("codigo") = True Then
transac.Rollback()
db.Conexion.Close()
Return "No se pudo guardar el registro, por favor intente de nuevo."
Else
transac.Rollback()
db.Conexion.Close()
Return ex.Message
End If
End Try
If i > 0 Then
db.Conexion.Close()
Return ""
Else
transac.Rollback()
db.Conexion.Close()
Return "fail"
End If
End Function
End class
Pero no me funciona :( , siempre que ejecuta toma el Catch exception con éste error :
{"ExecuteNonQuery requiere que el comando tenga una transacción cuando la conexión asignada al mismo está en una transacción local pendiente. No se ha inicializado la propiedad Transaction del comando."}
Entonces como no manejo esto de las transacciones en VB.NET, nose como solucionar dicho error. Hay algo que deba agregar, eliminar, modificar al codigo???