2014-06-04 32 views
7

Excel VBA'dan çağrılabilmemiz için, com interop ile ortaya koymak istediğim bazı C# kodları var. Birçok iç içe toplu güncelleştirme işlemi gerçekleştireceğinden, işlemleri desteklemem gerekiyor ve C# düzeyinde gerekli refakatörü en aza indirgemek için TransactionScope yaklaşımını kullanmak istiyorum:Excel VBA'dan bir TransactionScope başlatılıyor mu?

İşlem Kapsamı Kullanarak Kapalı Bir İşlemin Uygulanması
http://msdn.microsoft.com/en-us/library/ms172152.aspx

TransactionScope sınıf işlem kendisi ile etkileşime gerek kalmadan, bir işlem katılma gibi kod bloğu işaretlemek için basit bir yol sağlar. Bir işlem kapsamı 'u seçebilir ve ortam işlemini otomatik olarak yönetebilir. kullanım kolaylığı ve verimliliği nedeniyle, bir işlem uygulaması geliştirirken TransactionScope sınıfını kullanmanız önerilir. Ayrıca, işlemiyle açık bir şekilde kaynakları listelemenize gerek yoktur. Herhangi bir System.Transactions kaynak yöneticisi (SQL Server 2005 gibi), kapsam tarafından oluşturulan ve otomatik olarak listelenen ortam işleminin varlığını algılayabilir .

Sorum şu: VBA kodu içinde TransactionScope başlatabilir (veya birlikte çalışma örneğini ve TransactionScope nesneyi döndürmek için COM yoluyla AC# yöntemini çağırın) ve sonra çeşitli diğer C# nesneleri aramak devam etmek mümkündür COM Interop ile, tüm otomatik olarak tek kök işlemine katılacak mı?

+0

Hayır, kesinlikle VBA'da bunu yapamazsınız. –

+0

Ayrıntılı bilgi verebilir misiniz? (Umarım bir negatif olduğunu sormuyorum) – tbone

+0

Cevabımı sildim çünkü TransactionScope'un C# ne olduğunu ve VBA'da ne olacağını anlamak için aynı sayfada olduğumuzu düşünmüyorum. ADODB, bir İşlem sırasında herhangi bir değişikliği geri almak için mekanizmayı uygular, ancak bir TransactionScope'ta herhangi bir VBA kodunun bir bloğunu kapatamaz ve İşlem başarısız olursa ... –

cevap

1

Yaklaşımınızla ilgili bir sorun görmüyorum. Sen VBA'DA using yok, bu yüzden ya da bu şekilde içinde TransactionScope bertaraf etmeden yöntemi bırakmamak çok dikkatli olmak bir hata işleyicisi ve

  • kullanılarak

    • bunu taklit etmek gerekir.

    Örneğin, C# uygulamasında, aşağıdaki yöntemleri sağlamak varsayalım: Eğer C# DLL derlemek ve COM birlikte aracılığıyla Excel VBA bunu sağlamak

    public TransactionScope BeginTransactionScope() 
    { 
        return new TransactionScope(); 
    } 
    
    public void CommitTransactionScope(TransactionScope scope) 
    { 
        scope.Complete(); 
        scope.Dispose(); // simulates leaving the using { ... } scope 
    } 
    
    public void RollbackTransactionScope(TransactionScope scope) 
    { 
        scope.Dispose(); // simulates leaving the using { ... } scope 
    } 
    
    // Does some work using Connections and maybe nested scopes 
    public void DoSomeWork1() { ... } 
    public void DoSomeWork2() { ... } 
    public void DoSomeWork3() { ... } 
    

    .

    Private Sub MySub() 
    
        On Error Goto MyErrorHandler 
    
        ... 
        Dim scope As Object 
        Set scope = myCsObject.BeginTransactionScope() 
        ... 
        myCsObject.DoSomeWork1 
        ... 
        myCsObject.DoSomeWork2 
        ... 
        myCsObject.DoSomeWork3 
        ... 
        myCsObject.CommitTransactionScope scope 
        Set scope = Nothing 
        ... 
    
        Exit Sub 
    
    MyErrorHandler: 
        If Not (scope Is Nothing) Then 
         myCsObject.RollbackTransactionScope scope 
        End If 
        ' Remainder of your error handler goes here 
        ... 
    End Sub 
    

    Not TransactionScope beri dışında işlem kapsamı olacak herhangi bir veri size VBA kodu ile (DoSomeWork çağırır arasına) gerçekleştirmek erişmek olsa da, şu şekildedir: VBA, sen yöntemden klasik ADO veya DAO ile uyumlu değildir.

  • +0

    Üzgünüm, burada bir şeyi yanlış anlamış olabilirim, ancak C# 'yı işlemlerin üstesinden gelmek ve sadece VBA' dan açıkça çağırmak için kullandığınız şey budur. İşlem işleminin tamamını C# ile ele alabilir ve sonucu döndürmek için bir yönteme sahip olabilirsiniz. Neden C# 'dan kolayca ele alınabileceğinden, neden VBA'ya maruz kalıyoruz? –

    +0

    @mehow: 1. Yazım hatası tespit ettiğiniz için teşekkürler. 2. Belki çeşitli "DoSomeWork" çağrıları arasında VBA kodu yürütmesi gerekiyor? Her neyse, bu iyi bir soru, ama muhtemelen OP'den daha iyi bir şekilde bana yöneliyor. – Heinzi

    +0

    Evet, VBA'da 'using' kullanmıyorsunuz, ancak' '' 'ile '' ile bitiyor. C# ile aynı şekilde çalışmıyor, ama sanırım bir şekilde sanırım alakalı. Buradaki amacım, VBA’da VBA’da çalışma zamanı olarak bir TransactionScope’u kuramamanız ve eğer herhangi bir mantık varsa kendi kodunuzu geri almanıza izin vermemesidir. –