मेरे डेटाबेस में, तालिका में से एक में मेरे पास एक GUID कॉलम है जिसमें नल की अनुमति है। मेरे पास एक गाइड के साथ एक विधि है? पैरामीटर जो तालिका में एक नई डेटा पंक्ति डालता है। हालांकि जब मैं myNewRow.myGuidColumn = myGuid कहता हूं मुझे निम्न त्रुटि मिलती है: "निश्चित रूप से प्रकार 'System.Guid' को परिवर्तित नहीं कर सकता? 'System.Guid' के लिए। "निरर्थक GUID
उत्तर
एडीओ.NET एपीआई में कुछ समस्याएं हैं जब यह शून्य मूल्य प्रकारों को संभालने की बात आती है (यानी यह सही ढंग से काम नहीं करता है)। हमारे पास इसके साथ कोई समस्या नहीं है, और इस निष्कर्ष पर पहुंचे हैं कि मान को मैन्युअल रूप से शून्य पर सेट करना सर्वोत्तम है, उदा।
myNewRow.myGuidColumn = myGuid == null ? (object)DBNull.Value : myGuid.Value
यह दर्दनाक अतिरिक्त काम कि ADO.NET संभाल चाहिए, लेकिन यह इतना मज़बूती से (यहां तक कि 3.5 एसपी 1 में) करने के लिए प्रतीत नहीं होता। यह कम से कम सही काम करता है।
हमने एसकल्प पैरामीटर को पास करने योग्य मूल्य प्रकारों के साथ मुद्दों को भी देखा है जहां जेनरेट किए गए एसक्यूएल में के बजाय कीवर्ड के लिए कीवर्ड शामिल है, इसलिए पैरामीटर बनाने के दौरान मैं उसी दृष्टिकोण की अनुशंसा करता हूं।
ठीक है; myGuidColumn कैसे परिभाषित किया गया है, और myGuid कैसे परिभाषित किया गया है?
तो myGuid Guid?
है और myGuidColumn Guid
है, तो त्रुटि सही है: आप या शायद myGuid.GetValueOrDefault()
शून्य GUID वापस जाने के लिए myGuid.Value
, या (Guid)myGuid
उपयोग करने के लिए मान (जो अगर यह रिक्त है फेंक होगा) प्राप्त करने के लिए की आवश्यकता होगी, अगर शून्य है।
यदि myGuid Guid
है और myGuidColumn Guid?
है, तो यह काम करना चाहिए।
यदि myGuidColumn object
है, तो आपको नियमित नल के बजाय DBNull.Value
की आवश्यकता हो सकती है।
public static class Ado {
public static void SetParameterValue<T>(IDataParameter parameter, T? value) where T : struct {
if (null == value) { parameter.Value = DBNull.Value; }
else { parameter.Value = value.Value; }
}
public static void SetParameterValue(IDataParameter parameter, string value) {
if (null == value) { parameter.Value = DBNull.Value; }
else { parameter.Value = value; }
}
}
आप उपयोग कर सकते हैं एक सहायक विधि में Guid?
है चाहते हो सकता है :
internal static T CastTo<T>(object value)
{
return value != DBNull.Value ? (T)value : default(T);
}
या:
बेशक, अगर स्तंभ सही मायने में नल है, तो आप बस सुनिश्चित करने के लिए कि यह सी # कोड ;-p
आप अपने ग # कोड (व्यक्तिगत रूप से, मैं अक्सर यह नल प्रकार के साथ काम करने के लिए बोझिल लगता है) आप कर सकते थे कहीं जल्दी पिछवाड़े में नल GUIDs के साथ काम करने से बचना चाहते हैं एनईटी डेटा में Guid.Empty को इग्नल करें जो डीबी में शून्य है। इस तरह, आपको सभी को परेशान करने की ज़रूरत नहीं है। हेलवैल्यू सामान और बस इसके बजाय myGuid != Guid.Empty
जांचें।
मैं पहले से ही एक अलग "अर्थ" के साथ एक खाली GUID का उपयोग करता हूं। – kjv
ग्रेग बीच का जवाब
myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value
कोशिश System.Guid.Empty जहां यह शून्य
आप विस्तार तरीकों में कर रहे हैं होना चाहता हूँ ...
/// <summary>
/// Returns nullable Guid (Guid?) value if not null or Guid.Empty, otherwise returns DBNull.Value
/// </summary>
public static object GetValueOrDBNull(this Guid? aGuid)
{
return (!aGuid.IsNullOrEmpty()) ? (object)aGuid : DBNull.Value;
}
/// <summary>
/// Determines if a nullable Guid (Guid?) is null or Guid.Empty
/// </summary>
public static bool IsNullOrEmpty(this Guid? aGuid)
{
return (!aGuid.HasValue || aGuid.Value == Guid.Empty);
}
तब के रूप में ही आप कह सकते हैं: myNewRow.myGuidColumn = myGuid.GetValueOrDBNull();
नोट: यह होगा myGuid == Guid.Empty
पर शून्य डालें, यदि आप अपने कॉलम में खाली ग्रिड को अनुमति देना चाहते हैं तो आप आसानी से विधि को ट्विक कर सकते हैं।
आप एक nullable Guid
को null
कास्ट करने के लिए, यह है कि यह कैसे मेरे लिए काम किया है:
myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
- 1. GUID
- 2. GUID
- 3. वीबीएनईटी में निरर्थक प्रकार?
- 4. निरर्थक दिनांक समय?
- 5. बॉक्सिंग/अनबॉक्सिंग और निरर्थक?
- 6. "निरर्थक 'स्थिर' आपरिवर्तक"
- 7. निरर्थक ऑब्जेक्ट का मूल्य # 2
- 8. एक निरर्थक विदेशी कुंजी जोड़ना।
- 9. निरर्थक चर प्रकार - .value सदस्य
- 10. वीबीएनईटी का इतिहास निरर्थक वाक्यविन्यास
- 11. GUID को सत्यापित करने के लिए एक GUID
- 12. GUID उत्पन्न करना
- 13. GUID कैसे बनाएं?
- 14. COM इंटरफ़ेस GUID
- 15. टाइप GUID क्या है?
- 16. प्ले फ्रेमवर्क GUID
- 17. पैदा GUID हाइफन
- 18. भंडारण MySQL GUID/UUIDs
- 19. LINQ Guid toString()
- 20. परियोजना GUID बदलते
- 21. कमांड लाइन GUID?
- 22. GUID INT पहचान बनाम
- 23. मानव पठनीय GUID
- 24. GUID और नेमस्पेस
- 25. guid कैसे परिवर्तित करें?
- 26. एंड्रॉइड: GUID प्राथमिक कुंजी
- 27. वीबीएनईटी - निरर्थक दिनांक समय और टर्नरी ऑपरेटर
- 28. सी # निरर्थक प्रकार और मूल्य संपत्ति
- 29. एसक्यूएल सर्वर 2005: निरर्थक विदेशी कुंजी बाधा
- 30. निरर्थक प्रकार GetType() अपवाद फेंकता है
सशर्त अभिव्यक्ति का प्रकार निर्धारित नहीं किया जा सकता है, क्योंकि 'System.DBNull' और 'के बीच कोई अंतर्निहित रूपांतरण है वहाँ सिस्टम.गुइड ' – kjv
आह, क्षमा करें। फिक्स्ड। –
संभावित नल ऑब्जेक्ट के लिए फ़ॉलबैक मान पुनर्प्राप्त करते समय आप नल कोलेसिंग ऑपरेटर का उपयोग करने पर विचार कर सकते हैं: "(ऑब्जेक्ट) myGuid ?? DBNull.Value" –