entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Problema transacción sql con VB.NET

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

1 Respuesta

1voto

bl4z3r Puntos16850

Me gustaría responderte correctamente pero hablar sobre transacciones es un tema muy largo para un respuesta ya que abarca muchos temas. Te recomiendo que leas este articulo sobre transacciones para Vb.Net para que puedas orientarte mejor.

Transacciones con .NET

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta