В моей базе данных в одной из таблиц есть столбец GUID с допустимыми значениями null. У меня есть метод с Guid? параметр, который вставляет новую таблицу данных в таблицу. Однако, когда я говорю myNewRow.myGuidColumn = myGuid, я получаю следующую ошибку: "Невозможно неявно преобразовать тип" System.Guid? "? to 'System.Guid'.
Неверный GUID
Ответ 1
У ADO.NET API есть некоторые проблемы, связанные с обработкой значений NULL-значений (т.е. он просто работает неправильно). У нас не было никаких проблем с этим, и поэтому пришли к выводу, что лучше всего вручную установить значение в значение null, например.
myNewRow.myGuidColumn = myGuid == null ? (object)DBNull.Value : myGuid.Value
Это тяжелая дополнительная работа, которую ADO.NET должен обрабатывать, но она, похоже, не делает это надежно (даже в 3.5 SP1). Это, по крайней мере, работает правильно.
Мы также видели проблемы с передачей типов значений Nable в SqlParameters, где сгенерированный SQL включает ключевое слово DEFAULT
вместо NULL
для значения, поэтому я рекомендую использовать тот же подход при создании параметров.
Ответ 2
OK; как определяется myGuidColumn и как определяется myGuid?
Если myGuid имеет значение Guid?
, а myGuidColumn - Guid
, то ошибка верна: вам нужно будет использовать myGuid.Value
или (Guid)myGuid
, чтобы получить значение (которое будет выбрано, если оно равно null), или возможно, myGuid.GetValueOrDefault()
, чтобы вернуть нулевой указатель, если null.
Если myGuid Guid
, а myGuidColumn - Guid?
, то он должен работать.
Если myGuidColumn object
, вам, вероятно, понадобится DBNull.Value
вместо обычного null.
Конечно, если столбец действительно обнулен, вы можете просто захотеть убедиться, что он имеет значение Guid?
в коде С#; -p
Ответ 3
то же, что и ответ Грега Бука
myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value
Ответ 4
Вам нужно отбрасывать null
в nullable Guid
, как это сработало для меня:
myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value
Ответ 5
Попробуйте System.Guid.Empty, где вы хотите, чтобы он был нулевым.
Ответ 6
Если вы хотите избежать работы с нулевыми идентификаторами GUID в вашем коде С# (лично мне часто бывает сложно работать с типами с нулевым значением), вы могли бы где-то раньше назначать Guid.Empty для данных .NET, которые являются нулевыми в db. Таким образом, вам не нужно беспокоиться о всех материалах .HasValue и просто проверить, есть ли myGuid != Guid.Empty
.
Ответ 7
или
internal static T CastTo<T>(object value)
{
return value != DBNull.Value ? (T)value : default(T);
}
Ответ 8
Вы можете использовать вспомогательный метод:
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; }
}
}
Ответ 9
Если вы используете методы расширения...
/// <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
, вы можете легко настроить метод, если вы хотите разрешить пустые гиды в своем столбце.
Ответ 10
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}