मान लीजिए किसी (मुझे छोड़कर) निम्नलिखित कोड लिखते हैं और एक विधानसभा में संकलित:क्या मुझे एसक्यूएलकनेक्शन ऑब्जेक्ट से लंबित लेनदेन का संदर्भ मिल सकता है?
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (var transaction = conn.BeginTransaction())
{
/* Update something in the database */
/* Then call any registered OnUpdate handlers */
InvokeOnUpdate(conn);
transaction.Commit();
}
}
InvokeOnUpdate (IDbConnection Conn) करने के लिए कॉल एक ईवेंट हैंडलर है कि मैं लागू करने और रजिस्टर कर सकते हैं के लिए बाहर कॉल। इस प्रकार, इस हैंडलर में मुझे आईडीबीकनेक्शन ऑब्जेक्ट का संदर्भ होगा, लेकिन मेरे पास लंबित लेनदेन का संदर्भ नहीं होगा। क्या कोई तरीका है जिसमें मैं लेनदेन को पकड़ सकता हूं? मेरी OnUpdate हैंडलर में मैं निम्न जैसा कुछ पर अमल करना चाहते हैं:
private void MyOnUpdateHandler(IDbConnection conn)
{
var cmd = conn.CreateCommand();
cmd.CommandText = someSQLString;
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
हालांकि, cmd.ExecuteNonQuery() करने के लिए कॉल एक InvalidOperationException शिकायत की कि
"ExecuteNonQuery आदेश की आवश्यकता के लिए फेंकता एक लेनदेन जब कमांड को असाइन किया गया कनेक्शन लंबित स्थानीय लेनदेन में है। कमांड की लेनदेन संपत्ति प्रारंभ नहीं की गई है "।
क्या मैं किसी भी तरह से लंबित लेनदेन के साथ अपने SQLCommand cmd को सूचीबद्ध कर सकता हूं? क्या मैं आईडीबीकनेक्शन ऑब्जेक्ट से लंबित लेनदेन का संदर्भ पुनर्प्राप्त कर सकता हूं (यदि आवश्यक हो तो मुझे प्रतिबिंब का उपयोग करने में खुशी होगी)?
मुझे गलत हो सकता है, लेकिन मुझे लगता है कि आपके सुझाव की आवश्यकता है कि मेरे पास तीसरे पक्ष की लाइब्रेरी हो सकती है जिसे मैं एक सादे SqlConnection के बजाय एक MyConnection को तत्काल उपयोग कर रहा हूं। दुर्भाग्य से, मेरे पास स्रोत कोड नहीं है और यह किसी भी आकार या रूप में निर्भरता इंजेक्शन का समर्थन नहीं करता है। – Rune
सुनिश्चित नहीं है कि आपका क्या मतलब है। आपके मामले में आपकी "MyConnection" कक्षा SqlConnection, OleConnection या आप एक तर्क के रूप में क्या ले जाएगा। कोई इंजेक्शन जरूरी नहीं है। इस पर एक नज़र डालें कि "प्रतिनिधि डिजाइन पैटर्न" यहां कैसे काम करता है: http://en.wikipedia.org/wiki/Delegation_pattern – Denis
मुझे लगता है कि आपका क्या मतलब है। आपका मामला मुश्किल है क्योंकि आप तीसरे कनेक्शन को अपना कनेक्शन बना रहे हैं, मेरे मामले में मैं कई कनेक्शन बना रहा हूं लेकिन वे मेरे ऐप में ग्लोबल हैं इसलिए मैं लगातार लेनदेन खोल रहा हूं कि कौन सा लेनदेन खोल रहा है और मैं लेनदेन रखना चाहता हूं मेरे कनेक्शन। आपके मामले में मुझे लगता है कि आपके तीसरे पक्ष के निर्माण कनेक्शन को MyConnection में पारित करने के बाद लेनदेन ट्रैक किया जाएगा। आपको पता लगाना होगा कि क्या तीसरे पक्ष ने आपको कॉन पकड़ने से पहले लेनदेन बनाया है, तो शुरुआती लेनदेन को खोजने के लिए प्रतिबिंब का उपयोग करने के लिए आपके पास थोड़ा विकल्प नहीं होगा। – Denis