2010-06-17 22 views
5
public int GenPurchaseOrderNum() 
{ 
    Random random = new Random(); 
    _uniqueNum = random.Next(13287, 21439); 
    return UniqueNum; 
} 

मैं DB में PONumber स्तंभ से अद्वितीय बाधा हटा दिया क्योंकि एक कर्मचारी केवल पी ओ उत्पन्न करनी चाहिए कैसे उत्पन्न कर सकते हैं # जब सौदा सेट किया गया है। अन्यथा, पीओ # 0.मैं सी # में रैंडम unqiue नंबर

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

चूंकि मैंने अद्वितीय बाधा को हटा दिया है, इसलिए किसी भी उद्धरण में पीओ नहीं है। 0 मूल्य ले जाएगा। अन्यथा, पीओ के लिए एक अद्वितीय मूल्य उत्पन्न होता है। #। हालांकि, मेरे पास डीबी में एक अनूठी बाधा नहीं है जो मुझे यह जानना मुश्किल बनाती है कि आवेदन पीओओ उत्पन्न हुआ है या नहीं। # अद्वितीय है या नहीं।

मुझे क्या करना चाहिए?

मुझे आशा है कि मेरे सवाल का पर्याप्त

+5

संख्या को यादृच्छिक क्यों होना चाहिए? –

+3

हाँ - यादृच्छिक क्यों? मुझे लगता है कि आप एक अद्वितीय पीओ संख्या चाहते हैं, एक यादृच्छिक नहीं। यदि यह सच है तो पीओ संख्या उत्पन्न करने के लिए आईडी कॉलम पर एक अद्वितीय बाधा के साथ पीओ तालिका का उपयोग करना आसान होना चाहिए। – Cheeso

+2

ये संख्या लगभग हमेशा अनुक्रमिक हैं, है ना? अगर आपको किसी अन्य अनूठे संदर्भ की आवश्यकता है जिसे दुर्घटना में टाइप नहीं किया जा सकता है, तो मैं एक ग्रिड के साथ जाऊंगा। –

उत्तर

11

एक GUID ओवरहेड के रास्ते में थोड़ा अधिक है। विशेष रूप से, ऐसा लगता है कि आपको पीओ # के लिए मानव पठनीय संख्या की आवश्यकता है, जो एक GUID अव्यवहारिक बनाता है। मैं निम्नलिखित परिदृश्य का उपयोग करने के इच्छुक हूं।

  1. फ़ील्ड पर आपके पास मौजूद सभी बाधाओं को हटाएं।
  2. एक संग्रहित प्रक्रिया है जिसका उपयोग आप एक नया पीओ बनाने के लिए करते हैं जो पीओ # फ़ील्ड न्यूल छोड़ देता है।डीबी एनयूएलएल की दुनिया में वर्णित मामले में शून्य सबसे उपयुक्त है "अज्ञात" और चूंकि आपके पास वास्तव में कोई पीओ # नहीं है, यह अज्ञात है।
  3. एक संग्रहीत प्रक्रिया का उपयोग करें जो फ़ील्ड को अद्यतन करता है जब सौदा अगले उपलब्ध पीओ नंबर में वृद्धि के लिए पूरा हो जाता है। यह सर्वर की तरफ होगा, इसलिए इससे कोई फ़र्क नहीं पड़ता कि कौन से क्लाइंट से अपडेट आता है, वह अभी भी उस तालिका के लिए अद्वितीय होगा। यह संग्रहीत प्रक्रिया क्लाइंट को अद्यतन परिणाम सेट (यदि आवश्यक हो) वापस कर सकती है ताकि वे नया पीओ # देख सकें।

यह 20k फुट दृश्य है।

+0

मेरे लिए सही लगता है, मैंने पहले इस पैटर्न का उपयोग किया है, लेकिन मुझे टेबल पर लॉक के खिलाफ एक नया ग्रिड बनाने के ऊपरी हिस्से के बारे में कुछ संदेह हैं। –

+0

एक और विकल्प एक ऑटो-वृद्धिशील क्षेत्र का उपयोग करना होगा, और एक और बूलियन फ़ील्ड होगा जो इंगित करता है कि सौदा सेट है या नहीं। मान लीजिए कि एक कर्मचारी को केवल पीओ उत्पन्न करना चाहिए। # जब सौदा सेट किया जाता है 'एक * हार्ड * बाधा नहीं है, यह है .. –

+0

डिएगो, संग्रहीत प्रक्रिया पूरी तालिका को लॉक नहीं करेगी। यह सिर्फ रिकॉर्ड स्तर लॉक उत्पन्न करेगा, हालांकि पीओ # उत्पन्न होने की कठोर आवश्यकता के संबंध में डैनी के पास एक बिंदु हो सकता है। –

5

स्पष्ट है क्या तुम सच में एक यादृच्छिक मूल्य चाहते हैं, बजाय वापसी एक int आप एक GUID इस्तेमाल कर सकते हैं। ये अद्वितीय होने की गारंटी है:

एक GUID 128-बिट पूर्णांक (16 बाइट्स) है जिसका उपयोग सभी कंप्यूटरों और नेटवर्कों में किया जा सकता है जहां कहीं भी एक अद्वितीय पहचानकर्ता की आवश्यकता होती है। ऐसे पहचानकर्ता को डुप्लीकेट होने की बहुत कम संभावना है।

Source

वैकल्पिक उपयोग किए गए अंतिम संख्या का रिकॉर्ड रखने के लिए और बस इसे हर बार जब आप एक नया पीओ की जरूरत को बढ़ा देते है। सुनिश्चित करें कि आप इसके चारों ओर एक ताला लगा दें ताकि दो प्रक्रियाएं एक ही समय में कोशिश न करें और इसे बढ़ाएं।

+0

GUID #? क्यूं कर? –

+0

@ ब्लूराजा - ओपी ने विशिष्टता की गारंटी के लिए कहा, मैंने दो समाधान पेश किए। – ChrisF

5
  • अज्ञात मानों के लिए 0 का उपयोग न करें। अज्ञात/न जेनरेट किए गए मानों का प्रतिनिधित्व करने के लिए अद्वितीय बाधा वापस जोड़ें और न्यूल का उपयोग करें। यदि आप चाहें, तो उपयोगकर्ता को 0 के रूप में NULL प्रदर्शित करें, लेकिन यह समस्या के लिए ऑर्थोगोनल है।
  • अद्वितीय संख्या उत्पन्न करने के लिए यादृच्छिक उपयोग न करें और फिर सम्मिलित करने का प्रयास करें, आप अनावश्यक रूप से रीट्रीज़ और पुनर्जन्म के साथ तर्क जटिल करेंगे। अनुक्रम जनरेटर का उपयोग करें UPDATE seqnces SET sequence = sequence+1 OUTPUT INSERTED.sequence WHERE key = 'somekey'
  • व्यवसाय आदेश अर्थों जैसे क्रय आदेश संख्याओं को उत्पन्न करने के लिए यादृच्छिक उपयोग न करें। उपरोक्त की तरह अनुक्रम जनरेटर का प्रयोग करें।

अपडेट किया गया

एसक्यूएल सर्वर 2008 के साथ और सब कुछ के लिए एक बाधा 0 के बराबर नहीं के रूप में कार्य करने के लिए ऊपर आप एक अद्वितीय filtered index हो सकता है:

create unique index idxTbaleUniquePoNumber 
on <table> (po_number) 
where (po_number > 0); 

केक खाने का मन की क्रमबद्ध करें और यह भी ...

+0

"# अज्ञात मानों के लिए 0 का उपयोग न करें" - समस्या 0 को एप्लिकेशन से PONumber कॉलम में डाला जाता है। आवेदन स्तर पर मेरे पास "int poNum;" है परिवर्तनीय जो PONumber टेक्स्ट बॉक्स से मूल्य लेता है, यदि टेक्स्ट बॉक्स कोई संख्या नहीं है तो poNUm डीबी को 0 पास करेगा, भले ही मैं इसे नहीं चाहता हूं। मैं वृद्धि के साथ जाऊंगा – peace

2

यदि आप वास्तव में एक श्रेणी में अद्वितीय यादृच्छिक संख्याओं की श्रृंखला चाहते हैं (13287 से 21439 कहें) मैं सभी मान्य पूर्णांक की एक सूची तैयार करूंगा और फिर यादृच्छिक रूप से उन्हें चारों ओर स्वैप कर दूंगा। अगर आपको पसंद है तो एक अपरोर्ट की तरह। यह आपको यादृच्छिक, अद्वितीय संख्याओं की एक सूची देगा।

चाल उस सूची को सहेजना है क्योंकि यदि आप वास्तव में यादृच्छिक चाहते हैं तो इसे उत्पन्न करने में कुछ समय लगेगा। इसके बाद मैं इसे एक टेबल में रखूंगा ताकि आप इसे जहां भी चाहें वहां से इंडेक्स कर सकें।

+0

सूची उत्पन्न करने के लिए शफल एल्गोरिदम देखें। –

0

जो आपने लिखा है, उससे ऐसा लगता है कि आप गलत तरीके से आगे बढ़ रहे हैं: आप विशिष्टता के साथ यादृच्छिकता को भ्रमित कर रहे हैं।

आपने एक डोमेन विशिष्ट बाधा हटा दी है, ताकि यह आपके द्वारा लिखे गए कोड का पालन करे। यदि PONumber के मूल्य में अद्वितीय होने के अलावा कोई अन्य प्रासंगिकता नहीं है, तो डेटाबेस इसे आपके लिए उत्पन्न करता है, या एक GUID उत्पन्न करता है (यदि डेटाबेस नहीं कर सकता), जो आपको कुछ आश्वासन देता है कि उत्पन्न मूल्य अद्वितीय होगा।

अन्यथा, कड़ी मेहनत करने के लिए यह सब आपके ऊपर है। आपको सभी थ्रेडिंग और लेनदेन संबंधी मुद्दों को ध्यान में रखते हुए, एक अद्वितीय मूल्य उत्पन्न करना होगा।

0

पिछले पोस्टर की तरह, मैं एक यादृच्छिक मूल्य पर एक अद्वितीय मूल्य की अनुशंसा करता हूं। अनुक्रम जनरेटर रीमस सुझाव देता है कि यह सबसे अच्छा तरीका है।

हालांकि, यदि आप वास्तव में वास्तव में यादृच्छिक मान की आवश्यकता है, तो मैं यादृच्छिक वर्ग पर RNGCryptoServiceProvider का उपयोग करने की अनुशंसा करता हूं क्योंकि यह अधिक यादृच्छिक है। more information के लिए एमएसडीएन देखें। एक अच्छा स्टैक ओवरफ्लो question on RNGCryptoServiceProvider भी है।

0

मुझे लगता है कि आप शुरू करने के लिए गलत रास्ता नीचे चला गया है और यह और भी खराब हो रहा है। आपकी बताई गई समस्या के साथ कोई वास्तविक व्यापार औचित्य या आवश्यकता नहीं है, और इस प्रकार यह देखना मुश्किल है कि हमारे उत्तर आपके अंतिम लक्ष्यों को कैसे पूरा कर सकते हैं।

मुझे लगता है कि आपको इलाज करना चाहिए और इलाज के भौतिक कार्यान्वयन के संबंध में स्पष्ट रूप से अपने लक्ष्यों को तैयार करना चाहिए।

आमतौर पर, ऑर्डर सिस्टम को अद्वितीय पीओ की आवश्यकता होती है, इसलिए आपको उस पर एक अनोखी बाधा की आवश्यकता होती है। आम तौर पर, सिस्टम पीओएस और "प्री-पीओएस" को उसी तरह से स्टोर नहीं करते हैं। "प्री-पीओ" को आम तौर पर उद्धरण या कुछ समान कहा जाता है, और उनके पास अक्सर अपना स्वयं का नंबरिंग सिस्टम होता है। इस प्रकार आम तौर पर न्यूल या 0 पीओ संख्या होने में कोई संघर्ष नहीं होता है, क्योंकि ऐसा कुछ भी नहीं है जो वास्तविक पीओ के साथ वास्तविक पीओ संग्रहीत न हो। यहां तक ​​कि उन प्रणालियों में भी जो उन्हें एक साथ स्टोर करना चाहते हैं, वे आगे बढ़ते हैं और उन्हें एक ही अनुक्रम में एक संख्या देते हैं।

इसके अलावा, पीओ संख्या उत्पन्न करने के लिए एक पहचान पूरी तरह ठीक है।

0

छद्म यादृच्छिक संख्याओं के बारे में कैसे? अनुमोदित, भाषा पुस्तकालयों में यादृच्छिक संख्याओं के लगभग हर कार्यान्वयन पहले से ही छद्म यादृच्छिक हैं, लेकिन ऐसे एल्गोरिदम हैं जिन्हें आप कार्यान्वित कर सकते हैं जो विशिष्टता बनाए रखते हुए यादृच्छिकता की उपस्थिति देंगे।

कुछ के लिए list of pseudorandom number generators देखें। मुझे linear feedback shift register का विचार पसंद नहीं है जो संख्यात्मक उत्पन्न करने के लिए है और परिभाषित अवधि है (यानी, दोहराव संख्याओं के बीच आमंत्रण की संख्या)।

0

इस तरह की स्थितियों में, जहां कोई फ़ील्ड या फ़ील्ड का एक समूह है जो कि रिकॉर्ड का प्रतिनिधित्व करने वाली इकाई की स्थिति के कारण मूल्य नहीं है, मैं कभी-कभी तालिका को दो अलग-अलग तालिकाओं में तोड़ना पसंद करता हूं जो 1 से 1 रिश्ते में संबंधित हैं।

मान लेते हैं कि अपने मूल तालिका PurchaseOrder कहा जाता है चलो और एक संरचना है कि कुछ इस तरह दिखता है:

table PurchaseOrder 
(
    PurchaseOrderID int identity not null, 
    -- some other fields that are core to a purchase order 
    -- ... 
    PONumber int not null, 
    -- some other fields that are related to a purchase order when the deal is set 
    -- ... 

    -- define primary key on PuchaseOrderID 
    -- define unique constraint on PONumber field 
) 

मेरे सुझाव है कि मेज तोड़ने के लिए अलग इतना है कि यह कुछ इस तरह दिखता होगा:

table PurchaseOrder 
(
    PurchaseOrderID int identity not null, 
    -- some other fields that are core to a purchase order 
    -- ... 

    -- define primary key on PuchaseOrderID 
) 


table PurchaseOrderDealInfo 
(
    PurchaseOrderID int not null, 
    PONumber int identity not null, 
    -- some other fields that are related to a purchase order when the deal is set 
    -- ... 

    -- define primary key on PurchaseOrderID 
    -- define foreign key on PurchaseOrderID related to PurcahseOrder.PurchaseOrderID 
    -- define unique constraint on PONumber field 
) 

अब आपकी सौदा-विशिष्ट जानकारी एक अलग तालिका में है। कोई भी खरीद ऑर्डर जिनके पास अभी तक एक सौदा सेट नहीं है, केवल खरीद ऑर्डर डीयलइन्फो तालिका में एक समान रिकॉर्ड नहीं होगा। हां, यदि आप किसी विशिष्ट खरीद आदेश से संबंधित सभी जानकारी पुनर्प्राप्त करना चाहते हैं, तो आपको तालिकाओं में एक साथ शामिल होने की आवश्यकता होगी। हालांकि, आपको कुछ लाभ मिलते हैं:

  1. आप अभी भी PONumber कॉलम में एक अद्वितीय बाधा लागू कर सकते हैं।

  2. आप SQL सर्वर की पहचान सुविधा का लाभ लेने के लिए अपने PONumber उत्पन्न करने के लिए कर सकते हैं के लिए आप

  3. आप अपनी तालिका में किसी भी अन्य सौदा-विशिष्ट कॉलम बस क्योंकि वे कोई मान नहीं है कि आप व्यर्थ बनाया था एक सौदा सेट होने तक, फिर एक बार जब आप उन कॉलम को PurchaseOrderDealInfo तालिका में ले जाते हैं तो आप नल (यदि उपयुक्त हो) की अनुमति न दें।

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

+0

बहुत बढ़िया सलाह ... – peace

0

आपका autonumber पी एक अनूठा पीओ नंबर इस्तेमाल किया जा सकता ... बस पढ़ सकते हैं और इसे कॉपी जब यह एक 'असली' गैर शून्य पीओ नंबर हो जाता है।

यह "यादृच्छिक" नहीं होगा लेकिन यह अद्वितीय होगा।

अब बेवकूफ जवाब के लिए: यह आपके कंप्यूटर जितनी बार आप नए रैंडम कर कुछ अराजक "यादृच्छिक" बीज

11

बिना यादृच्छिक संख्या उत्पन्न करने के लिए के लिए संभव नहीं है() यह आरंभ नहीं हो जाता। इसका मतलब है कि एक तंग पाश में आपको वही मूल्य मिलता है। आपको एक ही यादृच्छिक उदाहरण रखना चाहिए और उसी उदाहरण पर अगला उपयोग करना जारी रखना चाहिए।

//Function to get random number 
private static readonly Random getrandom = new Random(); 
private static readonly object syncLock = new object(); 
public static int GetRandomNumber(int min, int max) 
{ 
    lock(syncLock) { // synchronize 
     return getrandom .Next(min, max); 
    } 
} 
संबंधित मुद्दे