अब हम गणना संबंधी संख्यात्मक मानों के रूप में गणना को कभी संग्रहीत नहीं करते हैं; यह डिबगिंग और समर्थन के रास्ते को बहुत कठिन बना देता है। हम स्ट्रिंग में परिवर्तित वास्तविक गणना मूल्य को संग्रहीत करते हैं:
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
और उसके बाद वापस पढ़ें:
Suit theSuit = Suit.valueOf(reader["Suit"]);
समस्या पिछले उद्यम प्रबंधक को घूरने और समझने की कोशिश में थी:
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
छंद
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
बाद बहुत आसान है। पूर्व को स्रोत कोड में प्राप्त करना और संख्यात्मक मानों को खोजना आवश्यक है जो कि गणन सदस्यों को सौंपा गया था।
हाँ यह अधिक जगह लेता है, लेकिन गणना सदस्य नाम कम हैं, और हार्ड ड्राइव सस्ते हैं, और समस्या होने पर मदद करने के लिए यह अधिक योग्य है।
इसके अतिरिक्त, यदि आप संख्यात्मक मानों का उपयोग करते हैं, तो आप उनसे बंधे हुए हैं। आप पुराने संख्यात्मक मानों को बाध्य किए बिना सदस्यों को अच्छी तरह से सम्मिलित या पुनर्व्यवस्थित नहीं कर सकते। उदाहरण के लिए, सूट गणना को निम्न में बदलना:
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
बनना होगा:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
डेटाबेस में संग्रहीत विरासत संख्यात्मक मूल्यों को बनाए रखने के लिए।
डेटाबेस में उन्हें कैसे छाँटा जाए
सवाल उठता है: मानों मैं ऑर्डर देना चाहता था। कुछ लोग एनुम के क्रमिक मूल्य द्वारा उन्हें क्रमबद्ध करना चाह सकते हैं। बेशक, गणना के संख्यात्मक मूल्य के आधार पर कार्डों का आदेश देना व्यर्थ है:
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
यह वह क्रम नहीं है जो हम चाहते हैं - हम उन्हें गणना क्रम में चाहते हैं:
SELECT Suit FROM Cards
ORDER BY CASE SuitID OF
WHEN 4 THEN 0 --Unknown first
WHEN 1 THEN 1 --Heart
WHEN 3 THEN 2 --Club
WHEN 2 THEN 3 --Diamond
WHEN 0 THEN 4 --Spade
ELSE 999 END
यदि आप तार को सहेजते हैं तो पूर्णांक मान सहेजने के लिए आवश्यक समान कार्य आवश्यक है:
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
लेकिन यह वह क्रम नहीं है जो हम चाहते हैं - हम उन्हें गणना क्रम में चाहते हैं:
SELECT Suit FROM Cards
ORDER BY CASE Suit OF
WHEN 'Unknown' THEN 0
WHEN 'Heart' THEN 1
WHEN 'Club' THEN 2
WHEN 'Diamond' THEN 3
WHEN 'Space' THEN 4
ELSE 999 END
मेरी राय है कि इस तरह की रैंकिंग उपयोगकर्ता इंटरफ़ेस में है। यदि आप उनकी गणना मूल्य के आधार पर आइटम सॉर्ट कर रहे हैं: आप कुछ गलत कर रहे हैं।
लेकिन अगर आप वास्तव में ऐसा करना चाहते हैं, तो मैं एक Suits
आयाम तालिका बनाऊंगा:
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
इस तरह, जब आप का उपयोग करने के लिए अपने कार्ड को बदलना चाहते हैं Kissing किंग्स न्यू डेक आदेश आप इसे प्रदर्शन प्रयोजनों के लिए दूर सब अपने डेटा फेंकने के बिना परिवर्तन कर सकते हैं:
| Suit | SuitID | Rank | Color | CardOrder |
|------------|--------------|---------------|--------|-----------|
| Unknown | 4 | 0 | NULL | NULL |
| Spade | 0 | 1 | Black | 1 |
| Diamond | 2 | 2 | Red | 1 |
| Club | 3 | 3 | Black | -1 |
| Heart | 1 | 4 | Red | -1 |
अब हम उपयोगकर्ताओं के लिए एक प्रदर्शन सेटिंग के साथ एक आंतरिक प्रोग्रामिंग विवरण (गणना नाम, गणना मूल्य) को अलग कर रहे हैं:
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder