Jump to content
joaomago

[Resolvido] Anexar ficheiro

Recommended Posts

joaomago

Bom dia.

Gostava que me pudessem ajudar na resolução de um erro.

É o seguinte: estou a criar um software para uma empresa, e preciso de anexar ficheiros na base de dados. Já criei na base de dados um campo varbinary, mas ao escolher o ficheiro e tentar inserir dá-me um erro na conversão.

"Implicit conversion from data type varchar to varbinary(max) is not allowed. Use the CONVERT function to run this query."

O que devo implementar de forma a resolver isso?

Edited by joaomago

Share this post


Link to post
Share on other sites
nelsonr

Boas,

podes mostrar o código que estás a usar para inserir o ficheiro na base de dados?

Share this post


Link to post
Share on other sites
joaomago

Claro, é este aqui:

public static bool AdicionarEntidadeAnexo(Entidades a, string caminho)
       {
           // receber uma entidade
           bool resultado = false;

           //Conexão
           SqlConnection cn = null;
           SqlCommand cmd = null;

           try
           {
               //Criar conexão
               cn = new SqlConnection();
               cn.ConnectionString = dbloading;
               cn.Open();

               //Criar um comando
               cmd = new SqlCommand();
               cmd.Connection = cn;
               cmd.CommandText = @"INSERT INTO IdentificacaoEntidade
                                  ([Nome]
                                  ,[Distrito]
                                  ,[Concelho]
                                  ,[Morada]
                                  ,[CodigoPostal]
                                  ,[Email]
                                  ,[Telefone]
                                  ,[Fax]
                                  ,[Website]
                                  ,[NumeroTrabalhadores]
                                  ,[DataAtualizacao]
                                  ,[Notas]
                                  ,[Anexos]
                                  ,[iD_Setor]
                                  ,[iD_TipoEntidade])

                                   VALUES('" + a.Nome + "','" + a.Distrito + "','" + a.Concelho + "','" + a.Morada + "','" + a.CodigoPostal + "','" + a.Email + "','" + a.Telefone + "','" + a.Fax + "','" + a.Website + "','" + a.NumTrabalhadores + "','" + a.Data + "','" + a.Notas + "','" + a.Anexos + "'," + a.IDSetor + "," + a.IDTipoEntidade + ")";

               System.IO.FileStream fs = new System.IO.FileStream(caminho, System.IO.FileMode.Open, System.IO.FileAccess.Read);

               Byte[] b = new Byte[fs.Length];
               fs.Read(b, 0, b.Length);
               fs.Close();
               SqlParameter P = new SqlParameter("Anexos", SqlDbType.VarBinary, b.Length,
               ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, b);
               cmd.Parameters.Add(P);
               if (cmd.ExecuteNonQuery() == 1)
               {
                   // se estiver preenchido
                   resultado = true;
               }

           }

           catch (Exception ex)
           {
               string erro = ex.StackTrace;
           }

           finally
           {
               //falta fechar conexão
               if (cn != null && cn.State != ConnectionState.Closed)
               {
                   cn.Close();
               }
           }
           return resultado;
       }

Edited by joaomago
Formatação de código

Share this post


Link to post
Share on other sites
bioshock

Adapta ao teu código.

string query = "INSERT INTO tabela ([anexo]) VALUES (@anexo)";
string path = @"C:\..."; // Caminho do ficheiro
FileStream fS = new FileStream(path, FileMode.Open, FileAccess.Read);
BinaryReader bR = new BinaryReader(fS);
Byte[] bytes = bR.ReadBytes((Int32)fS.Length);
bR.Close();
fS.Close();

cmd.Parameters.Add("@anexo", SqlDbType.VarBinary).Value = bytes;

  • Vote 1

Share this post


Link to post
Share on other sites
joaomago

Continua a dar o mesmo erro, talvez o problema esteja nestes dados:

Classes.Entidades a = new Classes.Entidades();

			a.Nome = txtNome.Text;

			if (cmbDistrito.SelectedItem == null)
			{
				a.Distrito = null;
			}

			else if (cmbDistrito.SelectedItem != null)
			{
				a.Distrito = cmbDistrito.SelectedItem.ToString();
			}

			if (cmbConcelho.SelectedItem == null)
			{
				a.Concelho = null;
			}

			else if (cmbConcelho.SelectedItem != null)
			{
				a.Concelho = cmbConcelho.SelectedItem.ToString();
			}

			a.Morada = txtMorada.Text;
			a.CodigoPostal = txtCP1.Text + "-" + txtCP2.Text;
			a.Email = txtEmail.Text;
			a.Telefone = txtTelefone.Text;
			a.Fax = txtFax.Text;
			a.Website = txtWebsite.Text;
			a.NumTrabalhadores = txtNTrabalhadores.Text;
			a.Data = data;
			a.Notas = txtNotas.Text;
			a.Anexos = 0;
			a.IDTipoEntidade = ((Classes.TipoEntidades)cmbTipoEntidade.SelectedItem).ID;
			a.IDSetor = ((Classes.Setores)cmbSetor.SelectedItem).ID;

			bool resultado = Classes.DadosEntidades.AdicionarEntidadeAnexo(a,Caminho);

			if (resultado)
			{
				MessageBox.Show("Entidade inserida com sucesso!", "Inserido", MessageBoxButtons.OK, MessageBoxIcon.Information);
                               }

Edited by joaomago

Share this post


Link to post
Share on other sites
nelsonr

No primeiro exemplo, experimenta altera para isto (ver parte a vermelho)

cmd.CommandText = @"INSERT INTO IdentificacaoEntidade
							  ([Nome]
							  ,[Distrito]
							  ,[Concelho]
							  ,[Morada]
							  ,[CodigoPostal]
							  ,[Email]
							  ,[Telefone]
							  ,[Fax]
							  ,[Website]
							  ,[NumeroTrabalhadores]
							  ,[DataAtualizacao]
							  ,[Notas]
							  ,[Anexos]
							  ,[iD_Setor]
							  ,[iD_TipoEntidade])

							   VALUES('" + a.Nome + "','" + a.Distrito + "','" + a.Concelho + "','" + a.Morada + "','" + a.CodigoPostal + "','" + a.Email + "','" + a.Telefone + "','" + a.Fax + "','" + a.Website + "','" + a.NumTrabalhadores + "','" + a.Data + "','" + a.Notas + "',@Anexos," + a.IDSetor + "," + a.IDTipoEntidade + ")";

  • Vote 1

Share this post


Link to post
Share on other sites
joaomago

Obrigado! Já alterei e funciona, agora estou com um outro problema, no campo Anexos da base de dados aparece preenchido apenas isto: <Binary data>

Logo não está a enviar nada ..

Share this post


Link to post
Share on other sites
nelsonr

E estás a ver isso como? pelo management studio? Ou estas a ler o campo

Share this post


Link to post
Share on other sites
joaomago

E estás a ver isso como? pelo management studio? Ou estas a ler o campo

Estava a ver pelo management studio. Então se ler o campo quer dizer que possam lá estar os dados?

Share this post


Link to post
Share on other sites
nelsonr

Estava a ver pelo management studio. Então se ler o campo quer dizer que possam lá estar os dados?

Sim, o management studio não mostra o conteúdo binário.

Share this post


Link to post
Share on other sites
nelsonr

O que queres mostrar exactamente?

Podes criar um ficheiro temporario e gravar lá o conteúdo do campo.

Depois podes mandar o windows abrir, que abre de acordo com a aplicação associada à extensão do ficheiro

Sendo assim o melhor será guardares tambem na base de dados o nome/extensão original do ficheiro

Share this post


Link to post
Share on other sites
joaomago

em principio pdf's e documentos word, mas poderá vir a ter mais coisas

Share this post


Link to post
Share on other sites
nelsonr

Pois, então vais ter de fazer como disse, guardas também o nome/extensão do ficheiro.

Isso é WinForm?

Quando precisares de ver, crias um ficheiro temporário com o nome gravado e poes lá o conteudo lido do campo binario.

Depois usas o Process.Start com o caminho completo do ficheiro, que o Windows tratará de abrir com a aplicação associada à extensão

Share this post


Link to post
Share on other sites
bioshock
// (...) lês o anexo numa query para um datareader = 'dR'

byte[] fileData = (byte[])dR[0]; // ficheiro binário
using (FileStream fS = new FileStream(Application.StartupPath + "\\ficheiros\\" + dR[1].ToString(), System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite)) // dr[1] = nome do ficheiro + extensão
{
using (BinaryWriter bW = new BinaryWriter(fS))
{
      bW.Write(fileData);
      bW.Close();
      Process.Start(Application.StartupPath + "\\ficheiros\\" + dR[1].ToString());
   }
}

Share this post


Link to post
Share on other sites
joaomago

Estou de novo a ter um problema a anexar ficheiro, mas desta vez no editar, o código é o seguinte:

cmd.CommandText = "UPDATE IdentificacaoEntidade SET Nome='" + a.Nome + "', Distrito='" + a.Distrito + "', Concelho='" + a.Concelho + "', Morada='" + a.Morada + "', CodigoPostal='" + a.CodigoPostal + "', Email='" + a.Email + "', Telefone='" + a.Telefone + "', Fax='" + a.Fax + "', Website='" + a.Website + "', NumeroTrabalhadores='" + a.NumTrabalhadores + "', DataAtualizacao='" + a.Data + "', Notas='" + a.Notas + "',Anexos=" + "',@Anexos'" + " WHERE ID='" + id + "'";
               cmd.ExecuteNonQuery();                                                                                                                                                                                                                                                                                                                                                                                                                          

               System.IO.FileStream fs = new System.IO.FileStream(caminho, System.IO.FileMode.Open, System.IO.FileAccess.Read);
               BinaryReader br = new BinaryReader(fs);
               Byte[] bytes = br.ReadBytes((Int32)fs.Length);
               br.Close();
               fs.Close();

               SqlParameter P = new SqlParameter("@Anexos", SqlDbType.VarBinary, bytes.Length,
               ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, bytes);
               cmd.Parameters.Add("@Anexos", SqlDbType.VarBinary).Value = bytes;
               if (cmd.ExecuteNonQuery() == 1)
               {
                   // se estiver preenchido
                   resultado = true;
               }

O erro é o mesmo do inicio: ' Implicit conversion from data type varchar to varbinary(max) is not allowed. Use the CONVERT function to run this query. '

Share this post


Link to post
Share on other sites
nelsonr

Experimenta assim

cmd.CommandText = "UPDATE IdentificacaoEntidade SET Nome='" + a.Nome + "', Distrito='" + a.Distrito + "', Concelho='" + a.Concelho + "', Morada='" + a.Morada + "', CodigoPostal='" + a.CodigoPostal + "', Email='" + a.Email + "', Telefone='" + a.Telefone + "', Fax='" + a.Fax + "', Website='" + a.Website + "', NumeroTrabalhadores='" + a.NumTrabalhadores + "', DataAtualizacao='" + a.Data + "', Notas='" + a.Notas + "', Anexos=@Anexos WHERE ID='" + id + "'";

Share this post


Link to post
Share on other sites
joaomago

Dá erro na declaração do Anexo : ' Must declare the scalar variable "@Anexos". '

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.