none
Como inserir campo blob num datatable? RRS feed

Respostas

  • Marcio nessa linha:

    Linha["BLTESTE"]     = ArquivoBinario.Read();

    Está faltando:

    Linha["BLTESTE"]     = ArquivoBinario.ReadBytes(Convert.ToInt32(Arquivo.Length));

    No btnInserir_Click
    terça-feira, 29 de setembro de 2009 20:16

Todas as Respostas

  • Marcio esse campo ter que ser insrido como typeof(byte[])
    Ai você precisa converter essa imagem em byte[], por exemplo se ela estiver em arquivo:

    FileStream stream = new FileStream("caminho da imagem", FileMode.Open);
    BinaryReader reader = new BinaryReader(stream);
    dataTable.Rows[linha]["nome da coluna"] = reader.Read(Convert.ToInt32(stream.Length));
    stream.Close();
    • Sugerido como Resposta Ari C. Raimundo terça-feira, 29 de setembro de 2009 17:34
    terça-feira, 29 de setembro de 2009 12:43
  • Obrigado Murilo, vou tentar aqui
    Valeu
    terça-feira, 29 de setembro de 2009 14:48
  • Ola Murilo deu certo consegui gravar um arquivo .pdf no banco mas agora não estou conseguindo estrair este arquivo para gravar no disco, voce pode me dizer como eu devo proceder?
    terça-feira, 29 de setembro de 2009 17:03
  • Marcio se estiver ja no datatable faça:

    FileStream stream = new FileStream("arquivo", FileMode.OpenOrCreate);
    BinaryWriter writer = new BinaryWriter(stream);
    writer.Write(dataTable.Rows[linha]["nome da coluna"]);
    stream.Close();
    terça-feira, 29 de setembro de 2009 17:09
  • Fiz como voce disse com uma ligeira diferença mas esta me dando erro:

                foreach (DataRow Linha in Tabela.Rows)
                {
                    if (Linha["IDTESTE"].ToString() == txtIdTeste.Text)
                    {
                        FileStream stream = new FileStream(txtArquivo.Text, FileMode.OpenOrCreate);
                        BinaryWriter writer = new BinaryWriter(stream);                   
                        writer.Write(Linha["BLTESTE"]);
                        stream.Close();

                        break;
                    }
                }

    Error    1    The best overloaded method match for 'System.IO.BinaryWriter.Write(string)' has some invalid arguments
    Error    2    Argument '1': cannot convert from 'object' to 'string'    D:\Testes\MultiBancoDataSet\Form1.cs    135    34    MultiBancoDataSet

    Me parece que ele não esta aceitando como parametro a minha Linha[BLTESTE].
    terça-feira, 29 de setembro de 2009 17:26
  • Márcio,

    Tente o seguinte:

    writer.Write((byte[])Linha["BLTESTE"]);

    Att.

    Ari C. Raimundo
    terça-feira, 29 de setembro de 2009 17:37
  • oops esqueci:

    writer.Write( (byte[])Linha["BLTESTE"]);
    terça-feira, 29 de setembro de 2009 17:38
  • Compilei e executei pessoal porem quando recupero o arquivo do banco de dados e gravo no disco, ele vem com o conteudo alterado. Por exemplo gravei um arquivo PDF no banco deste jeito como o Murilo:

                FileStream Arquivo = new FileStream(txtArquivo.Text, FileMode.Open);
                BinaryReader ArquivoBinario = new BinaryReader(Arquivo);

                foreach (DataRow Linha in Tabela.Rows)
                {
                    if (Linha["IDTESTE"].ToString() == txtIdTeste.Text)
                    {
                        Linha["NMTESTE"] = txtNmTeste.Text;
                        Linha["VLTESTE"] = double.Parse(txtVlTeste.Text);
                        Linha["DTCADASTRO"] = DateTime.Parse(txtDtCadastro.Text);
                        Linha["BLTESTE"] = ArquivoBinario.Read();

                        da.Update(Tabela);

                        break;
                    }
                }
                Arquivo.Close();

    E quando eu recupero ele desta forma:

                foreach (DataRow Linha in Tabela.Rows)
                {
                    if (Linha["IDTESTE"].ToString() == txtIdTeste.Text)
                    {
                        FileStream stream = new FileStream(txtArquivo.Text, FileMode.OpenOrCreate);
                        BinaryWriter writer = new BinaryWriter(stream);
                        writer.Write((byte[])Linha["BLTESTE"]);
                        stream.Flush();
                        stream.Close();
                        stream.Close();
                        break;
                    }
                }

    o conteúdo dele vem com um caracter parecido com isto [].
    terça-feira, 29 de setembro de 2009 17:51
  • Qual é o tipo de campo no banco? Varbinary?
    terça-feira, 29 de setembro de 2009 17:54
  • Isso mesmo!
    terça-feira, 29 de setembro de 2009 17:59
  • Estrnho com Varbinary(max) era pra dar certo. Ele vem todo com esse caracter?
    terça-feira, 29 de setembro de 2009 18:07
  • Marcio estava pensando, você está salvando no disco com o .pdf?
    terça-feira, 29 de setembro de 2009 18:19
  • Márcio,

    O ideal é que em sua base de dados exista, por exemplo, uma tabela Arquivo que possua relacionamento com essa tabela Teste, que você está retornando em seu DataSet. Assim, quando você solicita a listagem da tabela Teste os dados dos arquivos não são listados, o que melhora a performance.

    Uma outra sugestão é que esta tabela Arquivo contenha o nome original do arquivo (sem o caminho), o tipo (ex: MIME type), tamanho em bytes e os dados (conteúdo) do arquivo.

    Att.

    Ari C. Raimundo
    terça-feira, 29 de setembro de 2009 18:49
  • Estrnho com Varbinary(max) era pra dar certo. Ele vem todo com esse caracter?
    Não, o arquivo vem com um caracter só "[]"

    Marcio estava pensando, você está salvando no disco com o .pdf?
    Sim estou gravando com a mesma extenção.

    terça-feira, 29 de setembro de 2009 19:08
  • O ideal é que em sua base de dados exista, por exemplo, uma tabela Arquivo que possua relacionamento com essa tabela Teste, que você está retornando em seu DataSet. Assim, quando você solicita a listagem da tabela Teste os dados dos arquivos não são listados, o que melhora a performance.

    Uma outra sugestão é que esta tabela Arquivo contenha o nome original do arquivo (sem o caminho), o tipo (ex: MIME type), tamanho em bytes e os dados (conteúdo) do arquivo.

    Ola Ari, sim no meu banco quente eu terei esta situação.
    terça-feira, 29 de setembro de 2009 19:09
  • Pode me mandar seu método de insert do adapter?
    terça-feira, 29 de setembro de 2009 19:22
  • Segue toda a rotina Murilo:


        public partial class Form1 : Form
        {
            string              strConexao;
            OleDbConnection     conexao;
            OleDbDataAdapter    da;
            DataTable           Tabela;
            OleDbCommandBuilder cmb;

            public Form1()
            {
                InitializeComponent();
                strConexao = "Provider=SQLOLEDB.1;Password=morpheus;Persist Security Info=True;User ID=sa;Initial Catalog=dbDsvPhoenix;Data Source=DATASERVER";
                //strConexao = "Provider=OraOLEDB.Oracle.1;Password=dbdsvphoenix;Persist Security Info=True;User ID=dbdsvphoenix;Data Source=prod";
                //strConexao = "Provider=MSDAORA.1;Password=dbdsvphoenix;User ID=dbdsvphoenix;Data Source=prod;Persist Security Info=True";

                conexao    = new OleDbConnection(strConexao);
                da         = new OleDbDataAdapter("Select IDTESTE, NMTESTE, VLTESTE, DTCADASTRO, BLTESTE From TBLTESTE", conexao);
                cmb        = new OleDbCommandBuilder(da);
                Tabela     = new DataTable();


                da.InsertCommand = cmb.GetInsertCommand();
                da.DeleteCommand = cmb.GetDeleteCommand();
                da.UpdateCommand = cmb.GetUpdateCommand();

                da.Fill(Tabela);


                //dataGridView1.DataSource = Tabela;
            }

            private void btnInserir_Click(object sender, EventArgs e)
            {
                DataRow Linha = Tabela.NewRow();

                FileStream Arquivo = new FileStream(txtArquivo.Text, FileMode.Open);           
                BinaryReader ArquivoBinario = new BinaryReader(Arquivo);
               
                Linha["IDTESTE"]    = int.Parse(txtIdTeste.Text);
                Linha["NMTESTE"]    = txtNmTeste.Text;
                Linha["VLTESTE"]    = double.Parse(txtVlTeste.Text);
                Linha["DTCADASTRO"] = DateTime.Parse(txtDtCadastro.Text);
                Linha["BLTESTE"]     = ArquivoBinario.Read();

                Tabela.Rows.Add(Linha);

                da.Update(Tabela);
                Arquivo.Close();
            }

            private void btnAlterar_Click(object sender, EventArgs e)
            {
                FileStream Arquivo = new FileStream(txtArquivo.Text, FileMode.Open);
                BinaryReader ArquivoBinario = new BinaryReader(Arquivo);

                foreach (DataRow Linha in Tabela.Rows)
                {
                    if (Linha["IDTESTE"].ToString() == txtIdTeste.Text)
                    {
                        Linha["NMTESTE"] = txtNmTeste.Text;
                        Linha["VLTESTE"] = double.Parse(txtVlTeste.Text);
                        Linha["DTCADASTRO"] = DateTime.Parse(txtDtCadastro.Text);
                        Linha["BLTESTE"] = ArquivoBinario.Read();

                        da.Update(Tabela);

                        break;
                    }
                }
                Arquivo.Close();
            }

            private void btnOpenDialog_Click(object sender, EventArgs e)
            {
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                    txtArquivo.Text = openFileDialog1.FileName;
            }

            private void btnExcluir_Click(object sender, EventArgs e)
            {
                foreach (DataRow Linha in Tabela.Rows)
                {
                    if (Linha["IDTESTE"].ToString() == txtIdTeste.Text)
                    {
                        Linha.Delete();
                        da.Update(Tabela);

                        break;
                    }
                }

            }

            private void btnExtrairArquivo_Click(object sender, EventArgs e)
            {
                foreach (DataRow Linha in Tabela.Rows)
                {
                    if (Linha["IDTESTE"].ToString() == txtIdTeste.Text)
                    {
                        FileStream stream = new FileStream(txtArquivo.Text, FileMode.OpenOrCreate);
                        BinaryWriter writer = new BinaryWriter(stream);
                        writer.Write((byte[])Linha["BLTESTE"]);
                        stream.Flush();
                        stream.Close();
                        stream.Close();
                        break;
                    }
                }
               
            }
        }

    terça-feira, 29 de setembro de 2009 19:29
  • Marcio nessa linha:

    Linha["BLTESTE"]     = ArquivoBinario.Read();

    Está faltando:

    Linha["BLTESTE"]     = ArquivoBinario.ReadBytes(Convert.ToInt32(Arquivo.Length));

    No btnInserir_Click
    terça-feira, 29 de setembro de 2009 20:16
  • Bingooo,

    Valeu Murilo era isto mesmo, funcionou

    Obrigado
    terça-feira, 29 de setembro de 2009 20:26