none
transaccion para multiples DML's RRS feed

  • Pregunta

  • Buenas gente...

    necesito bloquear unos registros de la BD desde codigo en vb.net 2008 por un tiempo definido.
    Esto porq realizo una serie de llamadas a procedimientos almacenados y quisiera q si alguno de los SPs no se aplica, que se lleve a cabo un rollback total.

    Alguien que me guie en la manera adecuada de hacer esto??

    Agradezco la ayuda!
    • Cambiado Enrique M. Montejo domingo, 22 de mayo de 2011 15:59 acceso a datos (De:Lenguaje VB.NET)
    viernes, 12 de junio de 2009 18:27

Todas las respuestas

  • hola,

    lo mejor que hay para esta operacion es hacer uso de TransactionScope

    O sea crera un bloque de codigo:

    Using scope As New TransactionScope()

    End Using


    y dentro codifica todas tus llamadas a los stored procedure.

    si todo va bien realizas el scope.Complete()

    sino simplemente no haces nada y la transacciones a la db se anularan

    saludos

    Leandro Tuttini

    Work: Iceberg Solutions
    Blog
    Buenos Aires
    Argentina
    viernes, 12 de junio de 2009 18:45
  • Public Overridable Overloads Sub insertData()
            'variables de la funcion
            Dim intConta As Integer
            Dim dsDato As DataSet
    
            'variables temporales para el almacenamiento de los valores a insertar
            Dim strIdCliente As String
            Dim strIdTipo As String
            Dim strNumero As String
            Dim strExtension As String
            Dim strPropietario As String
    
            Using scope As New TransactionScope()
                If (filteredDataSearch() Is Nothing) = True Then
                    strIdCliente = clsData.insertData(frmManClientes.txtEmpresa.Text, _
                                                   frmManClientes.txtDireccion.Text, frmManClientes.txtRepresentante.Text, _
                                                   frmManClientes.txtContactoTI.Text)
                Else
                    strIdCliente = frmManClientes.txtIdCliente.Text
    
                    Call clsData.updateRecord(frmManClientes.txtIdCliente.Text, frmManClientes.txtEmpresa.Text, _
                                                  frmManClientes.txtDireccion.Text, frmManClientes.txtRepresentante.Text, _
                                                  frmManClientes.txtContactoTI.Text)
                End If
    
                Call clsDataTelefonos.deleteRecord(strIdCliente)
    
                Debug.Print(frmManClientes.dgvTelefonos.RowCount)
    
                'realiza la insercion de los numeros de telefono
                For intConta = 1 To frmManClientes.dgvTelefonos.RowCount - 2
                    dsDato = clsDataTipos.filteredSearch(frmManClientes.dgvTelefonos.Rows(intConta).Cells(0).Value.ToString)
                    strIdTipo = dsDato.Tables(0).Rows(0).Item("idTipo").ToString
                    Call modPrincipal.cierraDataset(dsDato)
    
                    strNumero = frmManClientes.dgvTelefonos.Rows(intConta).Cells(1).Value.ToString
                    strExtension = frmManClientes.dgvTelefonos.Rows(intConta).Cells(2).Value.ToString
                    strPropietario = frmManClientes.dgvTelefonos.Rows(intConta).Cells(3).Value.ToString
    
                    'envia los datos para ser insertados.
                    Call clsDataTelefonos.insertData(strIdCliente, strIdTipo, strNumero, strExtension, strPropietario)
    
                    strIdTipo = ""
                    strNumero = ""
                    strExtension = ""
                    strPropietario = ""
                Next
    
                scope.Complete()
            End Using
        End Sub
    me da un mensaje q dice: "Type TransactionScope is not defined"

    Agradezco la ayuda.!
    lunes, 15 de junio de 2009 15:06
  • Public Overridable Overloads Sub insertData()
            'variables de la funcion
            Dim intConta As Integer
            Dim dsDato As DataSet
    
            'variables temporales para el almacenamiento de los valores a insertar
            Dim strIdCliente As String
            Dim strIdTipo As String
            Dim strNumero As String
            Dim strExtension As String
            Dim strPropietario As String
    
            Using scope As New TransactionScope()
                If (filteredDataSearch() Is Nothing) = True Then
                    strIdCliente = clsData.insertData(frmManClientes.txtEmpresa.Text, _
                                                   frmManClientes.txtDireccion.Text, frmManClientes.txtRepresentante.Text, _
                                                   frmManClientes.txtContactoTI.Text)
                Else
                    strIdCliente = frmManClientes.txtIdCliente.Text
    
                    Call clsData.updateRecord(frmManClientes.txtIdCliente.Text, frmManClientes.txtEmpresa.Text, _
                                                  frmManClientes.txtDireccion.Text, frmManClientes.txtRepresentante.Text, _
                                                  frmManClientes.txtContactoTI.Text)
                End If
    
                Call clsDataTelefonos.deleteRecord(strIdCliente)
    
                Debug.Print(frmManClientes.dgvTelefonos.RowCount)
    
                'realiza la insercion de los numeros de telefono
                For intConta = 1 To frmManClientes.dgvTelefonos.RowCount - 2
                    dsDato = clsDataTipos.filteredSearch(frmManClientes.dgvTelefonos.Rows(intConta).Cells(0).Value.ToString)
                    strIdTipo = dsDato.Tables(0).Rows(0).Item("idTipo").ToString
                    Call modPrincipal.cierraDataset(dsDato)
    
                    strNumero = frmManClientes.dgvTelefonos.Rows(intConta).Cells(1).Value.ToString
                    strExtension = frmManClientes.dgvTelefonos.Rows(intConta).Cells(2).Value.ToString
                    strPropietario = frmManClientes.dgvTelefonos.Rows(intConta).Cells(3).Value.ToString
    
                    'envia los datos para ser insertados.
                    Call clsDataTelefonos.insertData(strIdCliente, strIdTipo, strNumero, strExtension, strPropietario)
    
                    strIdTipo = ""
                    strNumero = ""
                    strExtension = ""
                    strPropietario = ""
                Next
    
                scope.Complete()
            End Using
        End Sub
    me da un error: "Type TransactionScope is not defined".

    Agradezco tu ayuda!
    lunes, 15 de junio de 2009 15:23
  • me dice q : "Type transaction scope" is not defined.
    lunes, 15 de junio de 2009 16:02
  • me dice q el tipo TransactionScope no existe.
    martes, 16 de junio de 2009 13:48
  • Has insertado una referencia a System.Transactions?
    Por cierto, tienes también la alternativa de usar ADO.NET ya que la clase DbConnection y derivadas tienen la posibilidad de hacer un:

    - BeginTransaction() //empieza transacción

    Y la clase DbTransaction que permite hacer:

    - Commit() //confirma
    - Rollback() //anula transaccion

    Si tienes cualquier duda, lo dices.
    Saludos,

    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    martes, 16 de junio de 2009 15:28
    Moderador
  • Has insertado una referencia a System.Transactions?
    Por cierto, tienes también la alternativa de usar ADO.NET ya que la clase DbConnection y derivadas tienen la posibilidad de hacer un:

    - BeginTransaction() //empieza transacción

    Y la clase DbTransaction que permite hacer:

    - Commit() //confirma
    - Rollback() //anula transaccion

    Si tienes cualquier duda, lo dices.
    Saludos,

    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    martes, 16 de junio de 2009 15:28
    Moderador
  • hola,

    como te comenta Luis, has probado hacer referencia a: System.Transactions
    desde tu proyecto ?

    Y por supuesto agregar el using correspondiente: using System.Transactions;


    saludos
    Leandro Tuttini

    Work: Iceberg Solutions
    Blog
    Buenos Aires
    Argentina
    martes, 16 de junio de 2009 15:58
  • :-)
    Pues si, porque usar un TransactionScope sin using... pues como que no tiene mucho sentido, jejeje.
    Un saludo Leandro!

    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    martes, 16 de junio de 2009 16:00
    Moderador
  • uhmmm. entiendo a medias..

    ******************************************
    - BeginTransaction() //empieza transacción

    Y la clase DbTransaction que permite hacer:

    - Commit() //confirma
    - Rollback() //anula transaccion
    ******************************************

    donde deberia de colocar esas sentencias y donde realizo la importacion? En la definicion de la clase o en mi modulo principal?

    Agraedzco la ayuda de ambos.
    martes, 16 de junio de 2009 16:56
  • Hola,

    Como te decían, lo más sencillo es que utilices un TransactionScope. Sin embargo si quieres siempre puedes hacerlo mediante el método antes mencionado.
    Dale un vistazo a este artículo que escribí hace un tiempo acerca de las transacciones y los DataSets (tipados):
    http://geeks.ms/blogs/lfranco/archive/2008/01/04/tableadapters-transaccionales-si-por-favor.aspx

    Saludos,

    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    miércoles, 17 de junio de 2009 6:57
    Moderador
  • agradezco tu ayuda Lluis....

    Creo q necesito algo mas profundo.
    Como implemento eso en el codigo q tengo arriba?

    Tengo 2 llamadas y necesito q las 2 esten dentro de una transaccion.

    agradezco la ayuda.
    viernes, 19 de junio de 2009 14:07
  • hola,


    pero que ptoblema tuviste con el TransactionScope, yo lo he utilizado muhco y nunca tuve problemas.

    Segun veo el codigo que posteas parece esta definido correctamente.

    El error lo tienes al momento de compilar o cuando lo ejecutas ?
    si es cuando lo ejcutas en que linea del codigo que posteaste tienes el problema ?

    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 19 de junio de 2009 14:49