Подтвердить что ты не робот

Неверный GUID

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

4b9b3361

Ответ 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)
}