2010-04-07 20 views

cevap

9

BeginTrans yöntemi, işlemin yuvalanma düzeyini döndüren bir işlev olarak kullanılabilir. Bunu saklamak için bir özellik oluşturursanız, 0'dan büyük bir değer olup olmadığını görmek için istediğinizi kontrol edebilirsiniz. İşlemi gerçekleştirdiğinizde veya geri aldığınızda mülkünüzü kendiniz azaltmanız gerekir.

Private m_TransLevel As Long 

Public Property Get TransactionLevel() As Long 
    TransactionLevel = m_TransLevel 
End Property 
Public Property Let TransactionLevel(vLevel As Long) 
    m_TransLevel = vLevel 
End Property 

Public Sub SaveMyData() 

    TransactionLevel = adoConnection.BeginTrans() 
    ... 

End Sub 

Ayrıca seviye> 1. Ben de bu beğenmediğiniz True/False döndüren bir işlev içinde çalışmaya dönüş değeri adapte olabilir, ancak hata işleme olmadan böyle bir şey (görünecektir)

Public Function IsConnectionInsideTransaction(ByVal vADOConnection as ADOBD.Connection) As Boolean 
    Dim intLevel As Integer 

    If vADOConnection.State = AdStateOpen Then 
     intLevel = vADOConnection.BeginTrans() 
     IsConnectionInsideTransaction = (intLevel > 1) 
     vADOConnection.RollbackTrans 
    End If 

End Function 
+1

İlk yöntemin varyasyonlarını düşündüm, esasen ADODB.Connection'ı yeni Bu ve diğer işlevleri ekleyen MyConnection sınıfı. Mümkünse mevcut koddaki değişiklikleri en aza indirgemek istedi. İkinci yol benim soruma cevap veriyor, sanırım, ama benim için çok riskli görünüyor, aslında her kontrol ettiğimde veritabanıyla etkileşim kurmak istemiyorum ... Önerileriniz için teşekkürler! –

+1

Kendi bağlantı sınıfınızla sarmanın başka bazı avantajları olabilir. VB.net'e yükseltmeniz gerekiyorsa, tüm ADO nesnelerini kendi nesnelerinize yerleştirdiyseniz daha kolay olabilir. ADO için benzer imzalara sahip olabilirsiniz (mevcut koddaki değişiklikleri en aza indirmek için), ancak yükseltme işlevinin kapsamını sınırlamak için yalnızca en az işlevsellik açığa çıkarırsınız. Onları bir DLL projesine koymanızı öneriyorum, böylece ana proje ADO'ya bile atıfta bulunmuyor. Tam açıklama: bunu tamamen kendi projelerimizde yapmadık, ama keşke sahip olsaydık. – MarkJ

+0

Sadece raporlama motorumuz 'ADODB.Connection' etrafında bir sarıcı kullanıyorsa! Mevcut rapor çıkarma kodundaki değişiklikleri minimize etme fikriyle, kullanıcıların kablosuz bir bağlantı üzerinden raporları çalıştırabilmeleri için (ki bu durum bizim örneğimizde özel bir RPC sunucusundan geçiyor) fikrini belirledim. –

0

ADO durumunu kontrol edebilirsiniz. http://msdn.microsoft.com/en-us/library/ms675068%28v=VS.85%29.aspx

Muhtemelen bu parçayı zaten biliyorsunuzdur ama yine de göndereceğim.

Bu, işlemlerin ADO ile VB'de nasıl çalıştığını açıklar. http://support.microsoft.com/kb/198024

+1

Seni düşünmüyorum can. Bu benim baktığım ilk yerdi ve durum değerlerinin bir işlemde olup olmadığına dair söyleyecek bir şeyleri olmadığı anlaşılıyor. Bkz: http://msdn.microsoft.com/en-us/library/ms675546%28v=VS.85%29.aspx –

0

Kendiniz izlemediğiniz sürece yapamazsınız. Bağlantı nesnesinin işlem durumuyla ilgili bir özelliği yoktur. Elinizde başka bir tablo/ayar alanında bir bayrak ayarlamanız gerekecek (eğer işlenmemiş hatalar ortaya çıkarsa sorunlu olabilir ve eyalet bayrağı geçersiz bir durumla "sıkışmış" hale gelebilir) geçerli bir "zaman aşımı" ile veya önceki öğeyi yok saymak/öldürmek/geçersiz kılmak için geçersiz kılınır.

2

bir Microsoft SQL Server bağlanıyorsanız ve yeterince hızlı cevap güvenebilirsin (yani o) gezegenin diğer tarafında da yok sorguyu gerçekleştirebilir:

SELECT @@TRANCOUNT 
+0

Bu cevabı beğeniyorum! loş rstc, tc set rstc = adoCon.Execute ("SELECT @@ TRANCOUNT") tc = CLng (rstc.Fields (0)) –

İlgili konular