سؤال

في قاعدة البيانات الخاصة بي، في واحدة من الجدول لدي عمود GUID مع السماح بالقيم الخالية. لدي الأسلوب مع ارشد؟ المعلمة التي إدراج صف جديد للبيانات في الجدول. ولكن عندما أقول myNewRow.myGuidColumn = myGuid أحصل على الخطأ التالية: '؟ System.Guid "لا يمكن تحويل ضمنيا نوع إلى 'System.Guid ".

هل كانت مفيدة؟

المحلول

ووAPI ADO.NET لديها بعض المشاكل عندما يتعلق الامر بالتعامل مع أنواع القيمة قيم الفارغة (أي أنه ببساطة لا يعمل بشكل صحيح). لقد كان لدينا لا نهاية من القضايا معه، وهكذا وصلنا إلى استنتاج مفاده أنه من الأفضل لتعيين قيمة فارغة، يدويا منها مثلا.

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

وانها عمل إضافي مؤلم ADO.NET يجب التعامل معها، ولكن لا يبدو أن ذلك يعتمد عليه (حتى في 3.5 SP1). يعمل هذا على الأقل بشكل صحيح.

ولقد رأينا أيضا القضايا مع مرور أنواع قيمة nullable لSqlParameters حيث يتضمن SQL إنشاء DEFAULT الكلمة بدلا من NULL لقيمة ذلك أنصح نفس النهج عند بناء المعلمات.

نصائح أخرى

وOK. كيف يتم myGuidColumn محددة، وmyGuid كيف تعرف؟

إذا myGuid هو Guid? وmyGuidColumn هو Guid، ثم الخطأ هو الصحيح: سوف تحتاج إلى استخدام myGuid.Value، أو (Guid)myGuid للحصول على قيمة (والتي سوف رمي إذا كان فارغ)، أو ربما myGuid.GetValueOrDefault() للعودة الصفر GUID إذا لاغية.

إذا myGuid هو Guid وmyGuidColumn هو Guid?، فإنه يجب أن تعمل.

إذا myGuidColumn هو object، وربما كنت بحاجة DBNull.Value بدلا من اغية منتظم.

وبطبيعة الحال، إذا كان العمود قيم الفارغة حقا، قد ترغب ببساطة لضمان أن تكون Guid? في C # رمز ؛-p

ونفس الجواب جريج الزان و

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

وعليك أن يلقي null إلى nullable Guid، هذا كيف أنها عملت لي:

myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value

وحاول System.Guid.Empty حيث تريد أن يكون لاغيا

إذا كنت ترغب في تجنب العمل مع المعرفات الفريدة العمومية قيم الفارغة في حياتك ج # رمز (شخصيا، وأنا كثيرا ما تجد مرهقة للعمل مع أنواع nullable) هل يمكن في مكان ما في وقت مبكر تعيين <لأ href = "http://msdn.microsoft.com/ أون لنا / مكتبة / system.guid.empty.aspx "يختلط =" نوفولو noreferrer "> Guid.Empty لالبيانات. NET الذي هو باطل في ديسيبل. وبهذه الطريقة، لم يكن لديك لعناء مع كل الأشياء .HasValue وتحقق فقط إذا myGuid != Guid.Empty بدلا من ذلك.

وأو:

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

ويمكنك استخدام أسلوب مساعد:

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; }
    }
}

إذا كنت في طرق الإرشاد ...

/// <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، يمكن بسهولة قرص الأسلوب إذا كنت تريد السماح المعرفات الفريدة العمومية فارغة في العمود الخاص

Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top