Usuário com melhor resposta
Como inserir campo blob num datatable?

Pergunta
-
Respostas
-
Marcio nessa linha:
Linha["BLTESTE"] = ArquivoBinario.Read();
Está faltando:
Linha["BLTESTE"] = ArquivoBinario.ReadBytes(Convert.ToInt32(Arquivo.Length));
No btnInserir_Click- Sugerido como Resposta Murilo Amaru Gomes terça-feira, 29 de setembro de 2009 22:07
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 25 de novembro de 2010 21:36
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
-
-
-
-
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]. -
-
-
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 []. -
-
-
-
-
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 -
-
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. -
-
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;
}
}
}
}
-
Marcio nessa linha:
Linha["BLTESTE"] = ArquivoBinario.Read();
Está faltando:
Linha["BLTESTE"] = ArquivoBinario.ReadBytes(Convert.ToInt32(Arquivo.Length));
No btnInserir_Click- Sugerido como Resposta Murilo Amaru Gomes terça-feira, 29 de setembro de 2009 22:07
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 25 de novembro de 2010 21:36
-