2016-08-19 9 views
7

के साथ सी # WinForms में रिकॉर्ड और टेबल लॉकिंग मैं .NET Framework 4.6.1, WinForms, PostgreSQL 6.4beta4 और Npgsql और ADO.NET का उपयोग कर रहा हूं।PostgreSql और ADO.NET

मेरा वर्तमान एप्लिकेशन एक बहु-उपयोगकर्ता-एप्लिकेशन है जहां सभी उपयोगकर्ता एक ही डेटाबेस से कनेक्ट होते हैं।

डेटाटेबल, बाइंडिंगसोर्स, और बाइंडिंगविविगेटर का उपयोग करके डेटा नियंत्रण में बाध्य हो जाता है।

मैं उन दो उपयोगकर्ताओं से बचना चाहता हूं जो एक ही समय में डेटारो संपादित कर सकते हैं। क्योंकि मैं इसे अधिक सामान्य दृष्टिकोण पर कार्यान्वित करना चाहता हूं, मैं डेटाटेबल वंश बनाने के बारे में सोच रहा था और संपत्ति लॉकमोड (कोई नहीं, पंक्ति, तालिका) जोड़ रहा था।

मुझे पता चला कि आप डेटा पर परिवर्तनों का पता लगाने के लिए RowState के साथ संयोजन में कॉलम चेंजेड ईवेंट का उपयोग कर सकते हैं।

अब मुझे पता है कि उपयोगकर्ता एक नया मान डाल रहा है, संपादन (रोस्टस्टेट = संशोधित) एक मौजूदा एक या सिर्फ रिकॉर्ड में (रोस्टेट = अपरिवर्तित) दिखता है।

इसलिए उपयोगकर्ता डेटा संपादन को लॉक करने के बाद मैं डेटारो लॉक करने के लिए एक समाधान की तलाश में हूं। एप्लिकेशन में, जब मैं उपयोगकर्ता लॉक किए गए रिकॉर्ड में उपयोगकर्ता को नेविगेट करता है (बाइंडिंगविविगेटर या प्रोग्रामेटिक रूप से उपयोग करके) एक संदेश प्रदर्शित करना चाहता हूं।

अधिकांश समाधानों को मैंने इस तरह से MySQL सर्वर को लक्षित किया: How to perform a row lock? या TransactionScope locking table and IsolationLevel

हालांकि मैं एक पोस्टग्रेएसक्यूएल समाधान की तलाश में हूं, इसलिए एमएस (https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope(v=vs.110).aspx) से इस विषय पर लेख यहां भी उपयोग नहीं किए जा सकते हैं।

अगर मैं PostgreSQL और ADO.NET में अनुभव वाले किसी व्यक्ति को यहां मेरी सहायता कर सकता हूं तो मैं सराहना करता हूं। धन्यवाद।

+1

नेट में, क्लाइंट से लोड किया गया डेटा डीबी में उससे "डिस्कनेक्ट" होता है इसलिए कोई लिंक नहीं होता है। उस डेटा के संपादन आमतौर पर कोई फर्क नहीं पड़ता क्योंकि उन्हें आसानी से पूर्ववत/त्याग दिया जाता है। इसके अतिरिक्त, अगर कोई पंक्ति को संपादित करना शुरू करता है और किसी महत्वपूर्ण फोन कॉल द्वारा बाधित होता है तो क्या होगा? क्या आप चाहते हैं कि सभी उपयोगकर्ता अवधि के लिए बंद हो जाएं? क्या होगा यदि वे दोपहर के भोजन के लिए जाएं या बॉस द्वारा बुलाया जाए? – Plutonix

+0

हां, अगर कोई पंक्ति को संपादित करना शुरू करता है, तो मैं इसे अन्य उपयोगकर्ताओं द्वारा गैर-संपादन योग्य बनाना चाहता हूं, भले ही वह लंबे समय तक हो। – Thomas

+2

सबसे सरल समाधान एक कॉलम (बिट) जोड़ सकता है जो संपादन मोड में एक पंक्ति को झुकाता है। एक बार जब उपयोगकर्ता संपादन शुरू कर देता है, तो बिट (1) सेट करें। उपयोगकर्ता को संपादन करने के बाद, बिट (0) – lokusking

उत्तर

0

आपको अपने ग्राहकों को यह प्राप्त करने के लिए सिंक करना होगा।

मैं एक अतिरिक्त निरर्थक दिनांक कॉलम (RowIsBeeingEdited) जोड़ता हूं, जो उस समय को इंगित करता है जब पंक्ति ने संपादित करना शुरू किया था। मैं पंक्ति संपादित करने के लिए क्लाइंट ऐप पर संपादन योग्य/नहीं सेट करूंगा [RowIsBeeingEdited] मान।

इसके अलावा, मैं दो संकेतों लागू करना होगा: {UserStartedEditingRow} {& UserFinishedEditingRow}, जिसे सभी ग्राहकों के लिए उपलब्ध होने हैं, जो यह दर्शाता है कि ग्राहक एक्स शुरू कर दिया/संपादन समाप्त पंक्ति वाई

पर शुरू पंक्ति संपादित करें मैं पंक्ति सेट करूंगा [RowIsBeeingEdited] = {अब} और {UserStartedEditingRow} सिग्नल भेजें। अंत संपादन पर मैं पंक्ति सेट करूंगा [ROWIsBeeingEdited] = शून्य और {उपयोगकर्ताफिनिश एडिटिंगरो} सिग्नल भेजें। वर्तमान में सक्रिय ग्राहकों को दोनों सिग्नल प्राप्त करना चाहिए और पंक्ति संपादन योग्य/सेट करना चाहिए।

आशा है कि इसमें कुछ मूल्य है।

0

@lokusking द्वारा प्रदान किया गया सुझाव अच्छा लगता है। रखरखाव और विस्तार क्षमता के लिए आसान है।