使用Visual Basic.net和SQL Server 2008进行TransactionScope回滚

时间:2013-05-13 11:20:16

标签: .net vb.net sql-server-2008 visual-studio-2005 transactionscope

我正在学习如何在Visual Studio 2008中使用transactionScope和Visual Basic.net,我正在尝试轻松查询更新某些数据并启动异常,但是transactionScope没有进行回滚,数据已经更新,即使代码没有成为tran2.complete句子。

当我执行第二个查询时出现异常,因为字段idLegacy不存在。

任何人都可以帮助我吗?

        DB_MSSQL = New BBDD(ClassUtil.CadenaConexion_Destino)

        Using tran2 As New TransactionScope()
            Try
                Dim SqlPrueba As String = "UPDATE CAMPANIA_PEDIDOS set _idlegacy = -6 where Id = 151879"
                DB_MSSQL.dameDataSet(SqlPrueba)
                Dim SqlPrueba2 as String = "UPDATE CAMPANIA_PEDIDOS set idlegacy = -5 where Id = 151879"
                DB_MSSQL.dameDataSet(SqlPrueba2)
                tran2.Complete()
            Catch ex As TransactionAbortedException
                ClassUtil.PintaEnLog("Error al exportar pedido: " & ex.Message)
            End Try
        End Using

谢谢

1 个答案:

答案 0 :(得分:0)

要自动登记,必须打开(或可能创建连接,但更有可能打开声音)内部环境事务。例如:

    Using tran2 As New TransactionScope()
        Try
            DB_MSSQL = New BBDD(ClassUtil.CadenaConexion_Destino)
            Dim SqlPrueba As String = "UPDATE CAMPANIA_PEDIDOS set _idlegacy = -6 where Id = 151879"
            DB_MSSQL.dameDataSet(SqlPrueba)
            Dim SqlPrueba2 as String = "UPDATE CAMPANIA_PEDIDOS set idlegacy = -5 where Id = 151879"
            DB_MSSQL.dameDataSet(SqlPrueba2)
            tran2.Complete()
        Catch ex As TransactionAbortedException
            ClassUtil.PintaEnLog("Error al exportar pedido: " & ex.Message)
        End Try
    End Using

另外,假设DB_MSQL封装了一个连接,它也可能需要通过Using处理。

最后,我强烈建议您在构建TSQL时使用参数而不是连接 - 它更有效(服务器可以重用已解析的查询)并且更安全(SQL注入等)。如果只是为了这个例子,那么:没问题。