Обнуляемый GUID - PullRequest
       32

Обнуляемый GUID

26 голосов
/ 17 октября 2008

В моей базе данных в одной из таблиц у меня есть столбец GUID с разрешенными нулями. У меня есть метод с Guid? параметр, который вставляет новую строку данных в таблицу. Однако когда я говорю myNewRow.myGuidColumn = myGuid, я получаю следующую ошибку: «Не удается неявно преобразовать тип« System.Guid? » в "System.Guid". "

Ответы [ 10 ]

28 голосов
/ 17 октября 2008

У ADO.NET API есть некоторые проблемы, когда дело касается обработки типов значений, допускающих значение NULL (т.е. он просто не работает правильно). У нас не было никаких проблем с этим, и мы пришли к выводу, что лучше всего вручную установить значение на ноль, например,

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

Это тяжелая дополнительная работа, которую ADO.NET должен выполнить, но, похоже, он не делает это надежно (даже в 3.5 SP1). По крайней мере, это работает правильно.

Мы также сталкивались с проблемами при передаче типов значений, допускающих значение NULL, в SqlParameters, где сгенерированный SQL включает ключевое слово DEFAULT вместо NULL для значения, поэтому я рекомендую такой же подход при построении параметров.

9 голосов
/ 17 октября 2008

OK; как определяется myGuidColumn и как определяется myGuid?

Если myGuid равен Guid?, а myGuidColumn равен Guid, то ошибка верна: вам нужно будет использовать myGuid.Value или (Guid)myGuid для получения значения (которое будет выбрасываться, если оно равно нулю), или возможно myGuid.GetValueOrDefault() чтобы вернуть нулевую направляющую, если ноль.

Если myGuid равен Guid, а myGuidColumn равен Guid?, то он должен работать.

Если myGuidColumn равен object, вам, вероятно, потребуется DBNull.Value вместо обычного нуля.

Конечно, если столбец действительно обнуляемый, вы можете просто захотеть убедиться, что в коде C # он Guid?; -p

5 голосов
/ 02 ноября 2014

Вы должны разыграть null до nullable Guid, вот как это работает для меня:

myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value
5 голосов
/ 17 октября 2008

так же, как ответ Грега Бича

myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value
4 голосов
/ 15 июня 2011

Попробуйте System.Guid.Empty там, где вы хотите, чтобы он был нулевым

3 голосов
/ 17 октября 2008

Если вы хотите избежать работы с обнуляемыми GUID-кодами в вашем коде c # (лично мне часто бывает неудобно работать с обнуляемыми типами), вы могли бы где-нибудь рано назначить Guid.Empty для данных .NET, которые является нулевым в БД. Таким образом, вам не нужно беспокоиться обо всех вещах .HasValue и просто проверьте, если myGuid != Guid.Empty вместо.

2 голосов
/ 17 октября 2008

или

    internal static T CastTo<T>(object value)
    {
        return value != DBNull.Value ? (T)value : default(T);
    }
1 голос
/ 08 мая 2013

Если вы изучаете методы расширения ...

/// <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 будет добавлено значение NULL, вы можете легко настроить метод, если хотите разрешить пустые направляющие в вашем столбце.

1 голос
/ 17 октября 2008

Вы можете использовать вспомогательный метод:

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; }
    }
}
0 голосов
/ 19 октября 2015
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
...