2008-10-17 14 views
24

मेरे डेटाबेस में, तालिका में से एक में मेरे पास एक GUID कॉलम है जिसमें नल की अनुमति है। मेरे पास एक गाइड के साथ एक विधि है? पैरामीटर जो तालिका में एक नई डेटा पंक्ति डालता है। हालांकि जब मैं myNewRow.myGuidColumn = myGuid कहता हूं मुझे निम्न त्रुटि मिलती है: "निश्चित रूप से प्रकार 'System.Guid' को परिवर्तित नहीं कर सकता? 'System.Guid' के लिए। "निरर्थक GUID

उत्तर

27

एडीओ.NET एपीआई में कुछ समस्याएं हैं जब यह शून्य मूल्य प्रकारों को संभालने की बात आती है (यानी यह सही ढंग से काम नहीं करता है)। हमारे पास इसके साथ कोई समस्या नहीं है, और इस निष्कर्ष पर पहुंचे हैं कि मान को मैन्युअल रूप से शून्य पर सेट करना सर्वोत्तम है, उदा।

myNewRow.myGuidColumn = myGuid == null ? (object)DBNull.Value : myGuid.Value 

यह दर्दनाक अतिरिक्त काम कि ADO.NET संभाल चाहिए, लेकिन यह इतना मज़बूती से (यहां तक ​​कि 3.5 एसपी 1 में) करने के लिए प्रतीत नहीं होता। यह कम से कम सही काम करता है।

हमने एसकल्प पैरामीटर को पास करने योग्य मूल्य प्रकारों के साथ मुद्दों को भी देखा है जहां जेनरेट किए गए एसक्यूएल में के बजाय कीवर्ड के लिए कीवर्ड शामिल है, इसलिए पैरामीटर बनाने के दौरान मैं उसी दृष्टिकोण की अनुशंसा करता हूं।

+0

सशर्त अभिव्यक्ति का प्रकार निर्धारित नहीं किया जा सकता है, क्योंकि 'System.DBNull' और 'के बीच कोई अंतर्निहित रूपांतरण है वहाँ सिस्टम.गुइड ' – kjv

+0

आह, क्षमा करें। फिक्स्ड। –

+1

संभावित नल ऑब्जेक्ट के लिए फ़ॉलबैक मान पुनर्प्राप्त करते समय आप नल कोलेसिंग ऑपरेटर का उपयोग करने पर विचार कर सकते हैं: "(ऑब्जेक्ट) myGuid ?? DBNull.Value" –

9

ठीक है; 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; } 
    } 
} 
1

आप उपयोग कर सकते हैं एक सहायक विधि में Guid? है चाहते हो सकता है :

internal static T CastTo<T>(object value) 
    { 
     return value != DBNull.Value ? (T)value : default(T); 
    } 
2

या:

बेशक, अगर स्तंभ सही मायने में नल है, तो आप बस सुनिश्चित करने के लिए कि यह सी # कोड ;-p

3

आप अपने ग # कोड (व्यक्तिगत रूप से, मैं अक्सर यह नल प्रकार के साथ काम करने के लिए बोझिल लगता है) आप कर सकते थे कहीं जल्दी पिछवाड़े में नल GUIDs के साथ काम करने से बचना चाहते हैं एनईटी डेटा में Guid.Empty को इग्नल करें जो डीबी में शून्य है। इस तरह, आपको सभी को परेशान करने की ज़रूरत नहीं है। हेलवैल्यू सामान और बस इसके बजाय myGuid != Guid.Empty जांचें।

+0

मैं पहले से ही एक अलग "अर्थ" के साथ एक खाली GUID का उपयोग करता हूं। – kjv

5

ग्रेग बीच का जवाब

myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value 
4

कोशिश System.Guid.Empty जहां यह शून्य

1

आप विस्तार तरीकों में कर रहे हैं होना चाहता हूँ ...

/// <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 पर शून्य डालें, यदि आप अपने कॉलम में खाली ग्रिड को अनुमति देना चाहते हैं तो आप आसानी से विधि को ट्विक कर सकते हैं।

5

आप एक nullable Guid को null कास्ट करने के लिए, यह है कि यह कैसे मेरे लिए काम किया है:

myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value 
0
Guid? _field = null; 
if (myValue!="")//test if myValue has value 
{ 
_field = Guid.Parse(myValue) 
} 
संबंधित मुद्दे