समतुल्य है, मैं अपने डेटाबेस और मेरे सी # कोड के बीच एक कैशिंग परत लागू कर रहा हूं। विचार क्वेरी के पैरामीटर के आधार पर कुछ डीबी प्रश्नों के परिणामों को कैश करना है। डेटाबेस डिफ़ॉल्ट collation का उपयोग कर रहा है - या तो SQL_Latin1_General_CP1_CI_AS
या Latin1_General_CI_AS
, जो मुझे विश्वास है कि कुछ संक्षिप्त googling समानता के बराबर हैं, सॉर्टिंग के लिए बस अलग है।क्या .NET StringComparer SQL के लैटिन 1_General_CI_AS
मुझे एक .NET स्ट्रिंग कॉम्पैयर की आवश्यकता है जो कम से कम समानता परीक्षण और हैशकोड पीढ़ी के लिए समान व्यवहार दे सकता है, क्योंकि डेटाबेस का संयोजन उपयोग कर रहा है। लक्ष्य यह निर्धारित करने के लिए कि कोई विशेष स्ट्रिंग कुंजी पहले से ही कैश में है या नहीं, यह निर्धारित करने के लिए C# कोड में .NET शब्दकोश में StringComparer का उपयोग करने में सक्षम होना है।
वास्तव में एक सरल उदाहरण:
var comparer = StringComparer.??? // What goes here?
private static Dictionary<string, MyObject> cache =
new Dictionary<string, MyObject>(comparer);
public static MyObject GetObject(string key) {
if (cache.ContainsKey(key)) {
return cache[key].Clone();
} else {
// invoke SQL "select * from mytable where mykey = @mykey"
// with parameter @mykey set to key
MyObject result = // object constructed from the sql result
cache[key] = result;
return result.Clone();
}
}
public static void SaveObject(string key, MyObject obj) {
// invoke SQL "update mytable set ... where mykey = @mykey" etc
cache[key] = obj.Clone();
}
कारण यह महत्वपूर्ण है कि StringComparer से मेल खाता है डेटाबेस का मिलान कि दोनों झूठे सकारात्मक और मिथ्या नकारात्मक कोड के लिए बुरा प्रभाव होता है।
यदि स्ट्रिंगकॉम्पियर कहता है कि दो कुंजी ए और बी बराबर हैं, जब डेटाबेस का मानना है कि वे अलग हैं, तो डेटाबेस में दो पंक्तियों के साथ दो पंक्तियां हो सकती हैं, लेकिन कैश दूसरे को कभी वापस लौटाएगा उत्तराधिकार में ए और बी के लिए पूछा गया - क्योंकि बी के लिए प्राप्त करने से कैश को गलत तरीके से हिट कर दिया जाएगा और ए
समस्या को और अधिक सूक्ष्म बना दिया जाएगा यदि स्ट्रिंगकॉम्पियर कहता है कि डेटाबेस और ए डेटाबेस बी अलग हैं मानते हैं कि वे बराबर हैं, लेकिन कम समस्याग्रस्त नहीं हैं। दोनों कुंजी के लिए GetObject कॉल ठीक रहेगा, और उसी डेटाबेस पंक्ति से संबंधित ऑब्जेक्ट लौटाएंगे। लेकिन फिर कुंजी ए के साथ SaveObject को कॉल करना कैश को गलत छोड़ देगा; कुंजी बी के लिए अभी भी कैश प्रविष्टि होगी जिसमें पुराना डेटा है। बाद में GetObject (बी) पुरानी जानकारी देगी।
तो मेरे कोड को सही तरीके से काम करने के लिए मुझे समानता परीक्षण और हैशकोड पीढ़ी के लिए डेटाबेस व्यवहार से मेल खाने के लिए स्ट्रिंग कॉम्पैयर की आवश्यकता है। अब तक मेरे गुगल ने इस तथ्य के बारे में बहुत सारी जानकारी प्राप्त की है कि एसक्यूएल कॉलेशन और .NET तुलना बिल्कुल समान नहीं हैं, लेकिन मतभेदों के बारे में कोई जानकारी नहीं है, भले ही वे सॉर्टिंग में केवल अंतर तक ही सीमित हों या फिर यह खोजना संभव हो एक स्ट्रिंग कॉम्पैयर जो विशिष्ट एसक्यूएल संयोजन के बराबर है यदि सामान्य प्रयोजन समाधान की आवश्यकता नहीं है।
(साइड नोट - कैशिंग परत सामान्य उद्देश्य है, इसलिए मैं कुंजी की प्रकृति के बारे में विशेष धारणा नहीं कर सकता और क्या संयोजन उचित होगा। मेरे डेटाबेस में सभी तालिकाएं एक ही डिफ़ॉल्ट सर्वर संयोजन साझा करती हैं I बस मौजूद होने के साथ ही संयोजन को मिलान करने की आवश्यकता है)
दुर्भाग्यवश आईसीओएमपेयर में हैशकोड प्राप्त करने की क्षमता शामिल नहीं है - मुझे एक आईक्वालिटी कॉम्पैयर की आवश्यकता है जो स्ट्रिंगकॉम्पियर प्रदान करता है। – Stuart
@ स्टुअर्ट - मेरा संपादन देखें, CollactionInfo में IEqualityComparer है। – dana
क्या .NET SQL_Latin1_General_CP1_CI_AS समकक्ष (बस) मूलभूत प्रकार को कॉन्फ़िगर या कार्यान्वित करके प्राप्त करने का कोई तरीका है? एसएमओ मेरी स्थिति के लिए भारी वजन निर्भरता है। –