Houston we have a problem ....
Τρία classes ..
Το ένα κάνει ένα write σε πίνακα της Sybase :
Imports System.EnterpriseServices
Imports iAnywhere.Data.AsaClient
Public Interface ISybaseCall
Sub WriteToSybase(ByVal SybaseConnectionString As String)
End Interface
<Description("Transactional Sybase Object"), _
Transaction(TransactionOption.Supported), _
Synchronization(SynchronizationOption.Required)> _
Public Class Sybase
Inherits ServicedComponent
Implements ISybaseCall
<Description("Write to Sybase Server")> _
Public Sub WriteToSybase(ByVal SybaseConnectionString As String) Implements ISybaseCall.WriteToSybase
Dim MyCon As New AsaConnection(SybaseConnectionString)
Dim MyCom As New AsaCommand("INSERT INTO SYTEST(Des) Values('SybaseWriteTest')", MyCon)
Try
MyCon.Open()
MyCom.ExecuteNonQuery()
Catch ex As Exception
Throw ex
Finally
MyCon.Dispose()
MyCom.Dispose()
End Try
End Sub
End Class
Το δεύτερο σε πίνακα στον SQL Server :
Imports System.EnterpriseServices
Imports System.Data.SqlClient
Public Interface ISqlServerCall
Sub WriteToSqlServer(ByVal SINPServerConnectionString As String)
End Interface
<Description("Transactional SQL Object"), _
Transaction(TransactionOption.Supported), _
Synchronization(SynchronizationOption.Required)> _
Public Class sqlserver
Inherits ServicedComponent
Implements ISqlServerCall
<Description("Write to Sql Server")> _
Public Sub WriteToSqlServer(ByVal SQLServerConnectionString As String) Implements ISqlServerCall.WriteToSqlServer
Dim MyCon As New SqlConnection(SQLServerConnectionString)
Dim MyCom As New SqlCommand("INSERT INTO tblSqlTest(Des) Values('SQLWriteTest')", MyCon)
Try
MyCon.Open()
MyCom.ExecuteNonQuery()
Catch ex As Exception
Throw ex
Finally
MyCon.Dispose()
MyCom.Dispose()
End Try
End Sub
End Class
Το τρίτο απλά κάνει το coordination :
Imports System.EnterpriseServices
Public Interface IDistributed
Sub WriteToBothDatabases(ByVal SINPServerConnectionString As String, _
ByVal SybaseConnectionString As String)
End Interface
<Description("Coordinates a distributed transaction"), _
Transaction(TransactionOption.Required), _
Synchronization(SynchronizationOption.Required)> _
Public Class Distributed
Inherits ServicedComponent
Implements IDistributed
<Description("Write to both Servers"), _
AutoComplete(False)> _
Public Sub WriteToBothDatabases(ByVal InSQLServerConnectionString As String, ByVal InSybaseConnectionString As String) Implements IDistributed.WriteToBothDatabases
Dim MySqlOb As sqlserver
Dim MySybaseOb As Sybase
Try
MySqlOb = New sqlserver
With MySqlOb
.WriteToSqlServer(InSQLServerConnectionString)
End With
MySybaseOb = New Sybase
With MySybaseOb
.WriteToSybase(InSybaseConnectionString)
End With
ContextUtil.SetAbort()
Catch ex As Exception
ContextUtil.SetAbort()
Throw ex
Finally
MySqlOb.Dispose()
MySybaseOb.Dispose()
End Try
End Sub
End Class
To ContextId είναι το ίδιο, το TransactionId είναι το ίδιο ...
But ...
Η Sybase δεν κάνει Rollback ενώ ο SQL Server το κάνει κανονικότατα ....
Πάνος Αβραμίδης