2010-04-07 10 views
9

क्या केवल ADODB.Connection ऑब्जेक्ट का उपयोग करके बताने का कोई तरीका है, चाहे वह वर्तमान में लेनदेन में शामिल है या नहीं?वीबी 6 एडीओ कनेक्शन - लेनदेन में कैसे जांचें?

मैं इसे कनेक्ट ऑब्जेक्ट पर ही परीक्षण करने में सक्षम होना चाहूंगा, इसके बगल में एक बूलियन को अद्यतन रखने पर निर्भर किए बिना।

उत्तर

9

BeginTrans विधि को उस फ़ंक्शन के रूप में उपयोग किया जा सकता है जो लेनदेन के घोंसले स्तर को लौटाता है। यदि आप इसे स्टोर करने के लिए कोई संपत्ति बनाते हैं तो आप इसे देख सकते हैं कि आपको यह देखने की आवश्यकता है कि यह 0 से अधिक है या नहीं। जब आप प्रतिबद्ध करते हैं या रोलबैक करते हैं तो आपको संपत्ति को कम करने की आवश्यकता होगी।

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 

तुम भी एक समारोह है कि सही/गलत रिटर्न के अंदर काम करने के लिए करता है, तो स्तर> 1. मैं भी इस तरह नहीं है वापसी मान अनुकूलन सकता है, लेकिन यह (कुछ इस तरह त्रुटि हैंडलिंग के बिना लगेगा)

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

मैंने पहली विधि के बदलावों के बारे में सोचा है, अनिवार्य रूप से ADODB.Connection को एक नए में लपेटना MyConnection क्लास जो इसे और अन्य कार्यक्षमता जोड़ देगा। यदि संभव हो तो मौजूदा कोड में परिवर्तन को कम करना चाहता था। दूसरा तरीका मेरे प्रश्न का उत्तर देता है, मुझे लगता है, लेकिन मेरे लिए बहुत जोखिम भरा लगता है, मैं वास्तव में डेटाबेस के साथ बातचीत करने के लिए हर बार जांच नहीं करना चाहता ... सुझावों के लिए धन्यवाद! –

+1

अपने स्वयं के कनेक्शन वर्ग के साथ लपेटने के कुछ अन्य फायदे हो सकते हैं। यदि आपको कभी भी VB.net में अपग्रेड करने की आवश्यकता है, तो यदि आप सभी एडीओ ऑब्जेक्ट्स को अपनी ऑब्जेक्ट्स में लपेट चुके हैं तो यह आसान हो सकता है। आप उन्हें एडीओ (मौजूदा कोड में परिवर्तन को कम करने के लिए) के समान हस्ताक्षर कर सकते हैं, लेकिन अपग्रेड प्रयास के दायरे को सीमित करने के लिए केवल न्यूनतम कार्यक्षमता का पर्दाफाश कर सकते हैं। मैं उन्हें एक डीएलएल परियोजना में डालने का सुझाव दूंगा ताकि मुख्य परियोजना एडीओ का भी संदर्भ न दे। पूर्ण प्रकटीकरण: हमने इसे पूरी तरह से अपनी परियोजनाओं में नहीं किया है, लेकिन मेरी इच्छा है कि हमारे पास। – MarkJ

+0

यदि हमारे रिपोर्टिंग इंजन ने 'ADODB.Connection' के आस-पास एक रैपर का उपयोग किया है! मैंने मौजूदा रिपोर्ट निष्कर्षण कोड में परिवर्तन को कम करने के विचार के साथ खिलवाड़ किया है ताकि उपयोगकर्ता वायरलेस कनेक्शन पर रिपोर्ट चला सकें (जो हमारे मामले में एक कस्टम आरपीसी सर्वर के माध्यम से जाता है)। –

0

ऐसा लगता है कि आप एडीओ राज्य देख सकते हैं। http://msdn.microsoft.com/en-us/library/ms675068%28v=VS.85%29.aspx

आप शायद पहले से ही इस दूसरे हिस्से को जानते हैं लेकिन मैं इसे वैसे भी पोस्ट करूंगा।

यह बताता है कि लेनदेन वीबी में एडीओ के साथ कैसे काम करता है। http://support.microsoft.com/kb/198024

+1

मुझे आपको नहीं लगता कर सकते हैं। यह पहली जगह थी जिसे मैंने देखा था, और ऐसा लगता है कि राज्य के मूल्यों में लेनदेन में होने के बारे में कुछ कहना नहीं है या नहीं। देखें: http://msdn.microsoft.com/en-us/library/ms675546%28v=VS.85%29.aspx –

0

आप तब तक नहीं कर सकते जब तक कि आप इसे स्वयं ट्रैक न करें। कनेक्शन ऑब्जेक्ट में लेनदेन स्थिति से संबंधित संपत्ति नहीं है। यदि आपके पास यह है तो आपको अपनी तालिका को किसी अन्य तालिका/सेटिंग्स क्षेत्र में ध्वज सेट करना होगा (यदि अनचाहे त्रुटियां होती हैं तो समस्याग्रस्त हो सकती है और राज्य ध्वज कभी भी अमान्य स्थिति के साथ "अटक गया" हो जाता है, तो आपको आना चाहिए वैध "टाइमआउट" के साथ या पिछले को अनदेखा/मार/ओवरराइट करने के लिए ओवरराइड करें)।

2

आप एक Microsoft SQL सर्वर से कनेक्ट कर रहे हैं और काफी तेजी से प्रतिक्रिया करने के लिए उस पर भरोसा कर सकते हैं (अर्थात यह ग्रह के दूसरे पक्ष पर नहीं है) आप क्वेरी कर सकते हैं:

SELECT @@TRANCOUNT 
+0

मुझे यह जवाब पसंद है! मंद आरएसटीसी, टीसी सेट rstc = adoCon.Execute ("SELECT @@ TRANCOUNT") टीसी = CLng (rstc.Fields (0)) –