Pergunta

Eu tenho tentado ler uma imagem salva no Access DB como um objeto OLE em um PictureBox em um aplicativo do Windows C #.

O código que faz isso é apresentado a seguir:

        string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Rajesh\SampleDB_2003.mdb;";
        OleDbConnection oConn = new OleDbConnection(connString);
        oConn.Open();
        string commandString = "select * from employee where id = " + id + "";
        OleDbCommand oCmd = new OleDbCommand(commandString, oConn);
        OleDbDataReader oReader = oCmd.ExecuteReader(CommandBehavior.SequentialAccess);

        while (oReader.Read())
        {
            txtID.Text = ((int)oReader.GetValue(0)).ToString();
            txtName.Text = (string)oReader.GetValue(1);
            txtAge.Text = ((int)oReader.GetValue(2)).ToString();
            txtType.Text = (string)oReader.GetValue(3);
            byte[] imageBytes = (byte[])oReader.GetValue(4);

            MemoryStream ms = new MemoryStream();
            ms.Write(imageBytes, 0, imageBytes.Length);
            Bitmap bmp = new Bitmap(ms);
            pbPassport.Image = bmp;
        }
'Não parâmetro é válido'

Quando eu executar o código acima, uma exceção é lançada na linha:

Bitmap bmp = new Bitmap(ms)

A partir da mensagem de exceção, é claro que 'MS' é em um formato que não é reconhecível. Qualquer sugestão para superar isso?

Foi útil?

Solução

Seu bytestream está danificada de alguma forma, becouse eu tentei o método exato de seu, mas encheu o array de bytes com os dados PNG a partir de um arquivo em vez.

Gostaria de sugerir a criação de duas correntes, uma do banco de dados, e um dos autos que foi a origem da imagem no banco de dados. Em seguida, compará-los byte por byte. Se houver mesmo um byte de diffrence, os dados da imagem do banco de dados está corrompido.

Outras dicas

Infelizmente eu não tenho nenhuma boa resposta para você, mas posso dizer-lhe que quando eu tentei, eu tenho os mesmos resultados. Às vezes, ignorando os primeiros 78 bytes da matriz de bytes trabalhadas, por vezes, isso não aconteceu.

Isso ocorre porque o tipo de dados lojas OLE objeto algum tipo de cabeçalho no campo, para que o Access sabe que tipo de objeto OLE que é. Eu não poderia encontrar uma maneira confiável para trabalhar fora exatamente onde este cabeçalho parou e dados reais começou, mas eu também desistiu, então boa sorte:)

Faça uma pesquisa no google por AccessHdr. Você encontrará referências a AccessHdr.cpp e AccessHdr.h. Estes irão ilustrar o que é necessário para extrair os fluxos sem o cabeçalho.

Você não pode ler objetos OLE tão facilmente. Na verdade, é má prática para manter fotos como objetos OLE no banco de dados.

É preferível ter em como objetos BLOB ou o caminho eo nome do arquivo em algum armazenamento. AccessImagine pode lidar com ambos os cenários para MS Access e C #. Você pode baixá-lo aqui - http://access.bukrek.net

Você pode tentar:

pbPassport.Image = Image.FromStream(ms);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top