Pergunta

No meu banco de dados, em um da tabela Eu tenho uma coluna GUID com permitem valores nulos. Eu tenho um método com um Guid? parâmetro que insere uma nova linha de dados na tabela. No entanto, quando eu digo myNewRow.myGuidColumn = myGuid eu recebo o seguinte erro: 'System.Guid' "Não é possível converter implicitamente o tipo para 'System.Guid' ".

Foi útil?

Solução

A API ADO.NET tem alguns problemas quando se trata de lidar com tipos de valor nulo (ou seja, ele simplesmente não funciona corretamente). Nós tivemos nenhum fim de problemas com ele, e assim por ter chegado à conclusão de que é melhor para definir manualmente o valor como nulo, por exemplo.

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

É do trabalho extra doloroso que ADO.NET deve lidar, mas não parece fazê-lo de forma confiável (mesmo em 3.5 SP1). Esta, pelo menos, funciona corretamente.

Também vimos problemas com o passar tipos de valor nulo para SqlParameters onde o SQL gerado inclui a palavra-chave DEFAULT vez de NULL para o valor por isso eu recomendo a mesma abordagem na construção de parâmetros.

Outras dicas

OK; como é myGuidColumn definido, e como é myGuid definido?

Se myGuid é Guid? e myGuidColumn é Guid, então o erro é correta: você vai precisar usar myGuid.Value, ou (Guid)myGuid para obter o valor (que vai jogar se é null), ou talvez myGuid.GetValueOrDefault() para retornar o guid zero se null.

Se myGuid é Guid e myGuidColumn é Guid?, então ele deve funcionar.

Se myGuidColumn é object, você provavelmente precisará DBNull.Value vez do nulo regular.

É claro que, se a coluna é verdadeiramente anulável, você pode simplesmente querer garantir que é Guid? no código C # ;-p

mesmo que a resposta de Greg Beech

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

Você tem que null fundido a um nullable Guid, assim que ele trabalhou para mim:

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

Tente System.Guid.Empty onde quer que seja nula

Se você quer evitar trabalhar com GUIDs anuláveis ??em seu código C # (pessoalmente, muitas vezes eu achar que é complicado para trabalhar com tipos anuláveis) você poderia em algum lugar no início de atribuição Guid.Empty aos dados .NET que é nula no db. Dessa forma, você não tem que se preocupar com todo o material .HasValue e apenas verificar se myGuid != Guid.Empty vez.

ou

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

Você pode usar um método auxiliar:

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

Se você estiver nos métodos de extensão ...

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

Em seguida, você poderia dizer: myNewRow.myGuidColumn = myGuid.GetValueOrDBNull();

NOTA:. Isto irá inserir nulo quando myGuid == Guid.Empty, você pode facilmente ajustar o método se você deseja permitir Guids vazios em sua coluna

Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top