none
Exibição de campo Null RRS feed

  • Pergunta

  • Olá pessoal,

    Tenho o código abaixo:

    Exibe uma imagem em binário vinda do banco de dados.

    Meu problema, quando não há imagem gravada no banco de dados ele apresenta aquele "X", de imagem inexistente.

    Como faço para que quando o campo exibido for null, trazer uma imagem padrão, por exemplo:

    Se imagem do banco = Null, apresentar imagem152.gif.

    protected void Page_Load(object sender, EventArgs e)
        {
            string id = Request.QueryString["id"];

            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["VRIConnectionString"].ConnectionString);
            SqlCommand command = new SqlCommand("Usp_VRI_03_Imagens5_Ofertas_Detalhes", conn);
            command.CommandType = CommandType.StoredProcedure;

            command.Parameters.Add("ch_cod", SqlDbType.Int).Value = Int32.Parse(id);

            conn.Open();
            SqlDataReader r = command.ExecuteReader();

            if (r.Read())
            {
                if (!r.IsDBNull(0))
                {
                    byte[] imgData5 = (byte[])r["FOTO5"];
                    Response.BinaryWrite(imgData5);
                }
                else
                {
                    conn.Close();
                }
            }
        }
    }

    Grato

    Dirceu


    Dirceu Martins de Azevedo Grupo e-usinas Piracicaba/SP MSN:dirceuazevedo@hotmail.com SKYPE: dirceu.martins.azevedo

    segunda-feira, 14 de maio de 2012 13:20

Todas as Respostas

  • Olá Dirceu,

    Uma proposta seria alteração na sua stored procedure, para que ela mesma retorne esta imagem padrão caso o valor da coluna seja nulo.

    Você armazenaria esta imagem padrão em uma segunda tabela (talvez uma tabela de configurações gerais de seu aplicativo), e armazenaria o valor deste registro em uma variável declarada dentro de sua procedure. Por fim, utilizaria ISNULL para exibir a imagem padrão caso o campo esteja nulo.

    Exemplo:

    DECLARE @ImagemPadrao VARBINARY(MAX);
    SELECT @ImagemPadrao = CAST(Valor AS VARBINARY) FROM Configuracoes WHERE ConfigID = 1337;
    SELECT Nome, ISNULL(Foto, @ImagemPadrao) AS Foto FROM Cadastros;

    Vantagem desta proposta: Fácil implementação.

    Desvantagem: A imagem padrão será retransmitida para todos os registros que não tiverem uma imagem propriamente definida. Isto significa um arquivo igual sendo transmitido repetidas vezes, o que para pessoas buscando alto desempenho pode ser ruim.

    Outra proposta para evitar que a imagem seja retransmitida para todos os registros, é armazenar a sua imagem padrão como um arquivo de recurso (http://msdn.microsoft.com/pt-br/library/f45fce5x(v=vs.90).aspx) de sua aplicação Web, e utilizar este arquivo caso o valor do campo seja igual a DBType.DBNull.

    Note que você sentirá ganho de desempenho com a segunda alternativa apenas caso a sua aplicação seja de grande porte, caso contrário o ganho será pouco notável, levando em consideração que uma imagem padrão para "usuário sem foto" geralmente é bem pequena.

    []'s
    segunda-feira, 14 de maio de 2012 14:19
  • Dentro da stored procedure, quando faz o SELECT, ao seleccionar a coluna da imagem, usa o COALESCE. O COALESCE, caso o valor seja null, retorna algo que tu definas. Exemplo:

    SELECT COALESCE(nome_coluna, 'imagem152.gif') FROM tabela...


    Caso o valor seja nulo, vai retornar o imagem152.gif

    • Editado DavidSoares terça-feira, 15 de maio de 2012 12:57
    terça-feira, 15 de maio de 2012 12:56