2012-04-30 10 views
7

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

मैं डेटा स्तर समारोह db करने के लिए कॉल करता है कि होगा: वैसे भी, यहाँ वर्णन करने के लिए मैं क्या मतलब कोड है

public static int DLInsert(Person person) 
{ 
    Database db = DatabaseFactory.CreateDatabase("dbConnString"); 

    using (DbCommand dbCommand = db.GetStoredProcCommand("dbo.Insert_Person")) 
    { 
     db.AddInParameter(dbCommand, "@FirstName", DbType.Byte, person.FirstName); 
     db.AddInParameter(dbCommand, "@LastName", DbType.String, person.LastName); 
     db.AddInParameter(dbCommand, "@Address", DbType.Boolean, person.Address); 

     return db.ExecuteNonQuery(dbCommand); 
    } 
} 

फिर डेटा परत कार्य करने के लिए एक व्यापार परत कॉल:

public static bool BLInsert(Person person) 
{ 
    if (DLInsert(campusRating) != 1) 
    { 
     // log exception 
     return false; 
    } 

    return true; 
} 

और कोड-पीछे या ध्यान में रखते हुए (मैं क्या दोनों webforms और MVC परियोजनाओं):

if (BLInsert(person)) 
{ 
    // carry on as normal with whatever other code after successful insert 
} 
else 
{ 
    // throw an exception that directs the user to one of my custom error pages 
} 

जितना अधिक मैं इस प्रकार के कोड का उपयोग करता हूं, उतना ही मुझे लगता है कि यह अधिक है। विशेष रूप से कोड-पीछे/दृश्य में। क्या सरल डालने, अपडेट करने या हटाने के लिए कोई वैध कारण डेटाबेस में पंक्तियों की सही संख्या को वास्तव में संशोधित नहीं करेगा? क्या यह केवल वास्तविक एसक्लएक्सप्शन को पकड़ने और फिर इसे संभालने के बारे में चिंता करने के लिए अधिक व्यावहारिक है, हर बार प्रभावित पंक्तियों के लिए एकान्त जांच करने के बजाय?

धन्यवाद। आशा है कि आप सभी मेरी मदद कर सकते हैं।


अद्यतन

धन्यवाद समय जवाब देने के लिए समय निकालने के लिए हर किसी को। मैंने अभी भी 100% तय नहीं किया है कि मैं किस सेटअप का आगे बढ़ने का उपयोग करूंगा, लेकिन यहां मैंने आपके सभी प्रतिक्रियाओं से दूर ले लिया है।

  • एक क्वेरी को संभालने के लिए डीबी और नेट पुस्तकालयों पर भरोसा करें और उन्हें अपना काम करने के लिए डिज़ाइन किया गया है।
  • किसी भी त्रुटि पर क्वेरी को रोलबैक करने के लिए मेरी संग्रहीत प्रक्रियाओं में लेनदेन का उपयोग करें और संभावित रूप से raiseerror का उपयोग उन अपवादों को वापस करने के लिए .NET कोड को SqlException के रूप में करने के लिए करें, जो इन त्रुटियों को एक प्रयास/पकड़ के साथ संभाल सकता है। यह दृष्टिकोण समस्याग्रस्त रिटर्न कोड जांच को प्रतिस्थापित करेगा।

क्या दूसरे बुलेट बिंदु के साथ कोई समस्या होगी जो मुझे याद आ रही है?

उत्तर

5

मुझे लगता है कि सवाल बन जाता है, "आप यह क्यों जांच रहे हैं?" अगर ऐसा इसलिए है क्योंकि आप क्वेरी करने के लिए डेटाबेस पर भरोसा नहीं करते हैं, तो शायद यह अधिक है। हालांकि, इस चेक को करने के लिए एक तार्किक कारण मौजूद हो सकता है।

उदाहरण के लिए, मैंने एक कंपनी में एक बार काम किया जहां इस विधि को समवर्ती त्रुटियों की जांच के लिए नियोजित किया गया था। जब एप्लिकेशन में एप्लिकेशन को संपादित करने के लिए डेटाबेस से एक रिकॉर्ड प्राप्त किया गया था, तो यह LastModified टाइमस्टैम्प के साथ आएगा। फिर UPDATE करते समय डेटा एक्सेस लेयर में मानक सीआरयूडी ऑपरेशंस में WHERE [email protected] क्लॉज शामिल होगा और रिकॉर्ड संशोधित गणना की जांच करें। यदि कोई रिकॉर्ड अपडेट नहीं किया गया था, तो यह माना जाएगा कि एक समरूपता त्रुटि हुई थी।

मुझे लगा कि यह समवर्ती जांच (विशेष रूप से त्रुटि की प्रकृति को संभालने के बारे में हिस्सा) के लिए एक प्रकार का मैला था, लेकिन यह व्यवसाय के लिए काम पूरा हो गया।

आपके उदाहरण में मुझे और क्या चिंता है यह इस बात की संरचना है कि यह कैसे पूरा किया जा रहा है। डेटा एक्सेस कोड से 1 या 0 वापस लौटाया जा रहा है "जादू संख्या"। इससे बचा जाना चाहिए। यह डेटा एक्सेस कोड से व्यावसायिक तर्क कोड में कार्यान्वयन विवरण लीक कर रहा है। यदि आप इस चेक का उपयोग करना जारी रखना चाहते हैं, तो मैं चेक को डेटा एक्सेस कोड में ले जाने और अपवाद को फेंकने की अनुशंसा करता हूं। आम तौर पर, रिटर्न कोड से बचा जाना चाहिए।

संपादित करें: मैंने अभी आपके पिछले बिंदु से संबंधित, आपके कोड में संभावित रूप से हानिकारक बग देखा है। क्या होगा अगर एक से अधिक रिकॉर्ड बदल दिया गया है? यह शायदINSERT पर नहीं होगा, लेकिन आसानी से UPDATE पर हो सकता है। कोड के अन्य हिस्सों में यह माना जा सकता है कि != 1 का मतलब है कि कोई रिकॉर्ड नहीं बदला गया था। इससे डिबगिंग बहुत समस्याग्रस्त हो सकती है :)

+0

रिटर्न कोड के बारे में टिप्पणी के लिए उपरोक्त। वे बुरे हैं। मैं विभिन्न परियोजनाओं पर दो डेवलपर्स के साथ काम करता हूं, और एक सफलता के रूप में 1 का उपयोग करता है, दूसरा विफलता के रूप में 1 का उपयोग करता है। गन्दा गन्दा सामान। –

+0

@ ब्रेंडन डुगन: दरअसल, इन दिनों रिटर्न कोड की आवश्यकता नहीं है, कम से कम .NET दुनिया में नहीं। अपवाद विधियों के लिए पूरी तरह से मान्य निकास पथ हैं और त्रुटियों के बारे में उपयोगी जानकारी ले जाने के लिए डिज़ाइन किए गए हैं। एक रिटर्न कोड की सबसे नज़दीकी चीज जो मुझे समझ में आती है, मुझे लगता है कि, समान रूप से संरचित या स्वत: जेनरेट की गई सेवाओं के लिए एक सामान्य रिटर्न प्रकार (सामान्य प्रकार का सामान्य 'आईरस्पॉन्स') का विचार है। इसमें 'सफलता' ध्वज और/या 'त्रुटियों' संग्रह जैसे कुछ शामिल हो सकते हैं। – David

+0

मैं रिटर्न कोड और! = 1 के बारे में आपका बिंदु देखता हूं।मुझे लगता है कि मैंने अभी डीबी पर भरोसा नहीं किया है, इसलिए ये अतिरिक्त चेक वास्तव में अधिक हो सकते हैं। – ryanulit

1

मैंने हमेशा अपने sproc में raiserror पसंद किया है और गिनने के बजाय अपवादों को संभाला है। इस तरह, यदि आप कुछ और करने के लिए एक स्पोक अपडेट करते हैं, जैसे लॉगिंग/ऑडिटिंग, आपको पंक्ति गणना को चेक में रखने के बारे में चिंता करने की ज़रूरत नहीं है।

हालांकि यदि आप अपने कोड में दूसरी जांच पसंद करते हैं या अपवाद/raiserror से निपटना नहीं चाहते हैं, तो मैंने डीबी में प्रत्येक स्पोक के लिए सफल स्पोक निष्पादन पर टीमों को 0 वापस कर दिया है, और अन्यथा अन्य नंबर लौटाते हैं।

2

एक तरफ, ज्यादातर समय सबकुछ आपके द्वारा अपेक्षित तरीके से व्यवहार करना चाहिए, और उस समय अतिरिक्त चेक आपके आवेदन में कुछ भी नहीं जोड़ते हैं। दूसरी तरफ, अगर कुछ गलत हो जाता है, तो इसके बारे में नहीं जानना मतलब है कि इससे पहले कि आप इसे नोटिस कर सकें तो समस्या काफी बड़ी हो सकती है।मेरी राय में, अतिरिक्त सुरक्षा का थोड़ा सा अतिरिक्त प्रयासों के लायक है, खासकर अगर आप विफलता पर रोलबैक लागू करते हैं। यह आपकी कार में एक एयरबैग की तरह है ... यदि आप कभी दुर्घटनाग्रस्त नहीं होते हैं, तो यह वास्तव में एक उद्देश्य प्रदान नहीं करता है, लेकिन यदि आप ऐसा करते हैं तो यह आपके जीवन को बचा सकता है।

0

यह बिल्कुल ओवरकिल है। आपको भरोसा करना चाहिए कि आपका मूल मंच (नेट पुस्तकालय, एसक्यूएल सर्वर) सही तरीके से काम करता है - आपको इसके बारे में चिंता नहीं करनी चाहिए।

अब, वहाँ कुछ संबंधित मामलों में जहां आप परीक्षण करने के लिए, की तरह है, तो लेन-देन को सही ढंग से, वापस लुढ़का कर रहे हैं आदि

0

तो यह है कि जांच करने के लिए एक की जरूरत है चाहते हो सकता है कर रहे हैं, यही कारण है कि डेटाबेस के भीतर ही है कि जांच नहीं ? आप खुद को एक राउंड ट्रिप करने से बचाते हैं और यह एक और 'केंद्रीकृत' चरण में किया जाता है - यदि आप डेटाबेस में चेक करते हैं, तो आपको आश्वस्त किया जा सकता है कि यह उस डेटाबेस को हिट करने वाले किसी भी एप्लिकेशन से लगातार लागू किया जा रहा है। जबकि यदि आप यूआई में तर्क डालते हैं, तो आपको यह सुनिश्चित करना होगा कि कोई भी यूआई एप्लीकेशन जो उस विशेष डेटाबेस को हिट करता है, सही तर्क लागू करता है और यह लगातार करता है।

संबंधित मुद्दे