none
Imagens no SQL para MySQL RRS feed

  • Pergunta

  • Bom dia!

    Tenho um problema bastante complexo aqui. Tenho imagens gravadas no SQL e preciso transferí-las para o MySQL, mas elas "não podem de maneira alguma passarem ou estarem em um diretório", essa é a regra. Tentamos utilizar diversos tipos de dados, tinyblob, blob, mediumblob, longblob, longtext, varchar(max) e nada, a mensagem sempre aparece como erro que vai truncar string com binary, etc...no SQL estão como tipo "image". Alguém pode dar uma ajuda?

    Grato desde já.

    Att,

    Ricardo.

    quarta-feira, 6 de novembro de 2013 11:22

Respostas

  • Ok, vou dar uma olhada com o pessoal de desenvolvimento e depois falo o que aconteceu. Obrigado.

    Aqui ta um exemplo do código que eu mesmo fiz testado e funcional

    Classe que vai auxiliar o trafego da informação entre os bancos ...

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Img.ConsoleApplication
    {
        public class Arquivo
        {
            public int Id { get; set; }
            public byte[] Imagem { get; set; }
            public string Tipo { get; set; }
        }
    }

    Rotinas de Trafego entre os Bancos...

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using MySql;
    using MySql.Data;
    using MySql.Data.Types;
    using MySql.Data.MySqlClient;
    using System.Data.SqlClient;
    namespace Img.ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<Arquivo> arquivos = new List<Arquivo>();
                //ROTINA SQL SERVER
                SqlConnection Conexao = new SqlConnection(@"Data Source=.\SqlExpress;Initial Catalog=App;Persist Security Info=True;User ID=sa;Password=senha;MultipleActiveResultSets=True;Application Name=EntityFramework");
                Conexao.Open();
                SqlCommand Commando = Conexao.CreateCommand();
                Commando.CommandType = System.Data.CommandType.Text;
                Commando.CommandText = "SELECT [Id] ,[Imagem] ,[Tipo] FROM [App].[dbo].[Imagens]";
                SqlDataReader reader = Commando.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        arquivos.Add(new Arquivo()
                        {
                            Id = reader.GetInt32(0),
                            Imagem = reader.IsDBNull(1) == false ? (byte[])reader[1]: null,
                            Tipo = reader.GetString(2)
                        });
                    }
                }
                reader.Close();
                reader.Dispose();
                Commando.Dispose();
                Conexao.Close();
                Conexao.Dispose();
                //
                //ROTINA BANCO MYSQL
                MySqlConnection mConexao = new MySqlConnection(@"server=localhost;User Id=root;password=se;database=dbteste;Persist Security Info=True");
                mConexao.Open();
                foreach (Arquivo arq in arquivos)
                {
                    MySqlCommand mComando = mConexao.CreateCommand();
                    mComando.CommandType = System.Data.CommandType.Text;
                    mComando.CommandText = "INSERT INTO arquivos(imagem, tipo) values(@imagem, @tipo);";
                    mComando.Parameters.Add("@imagem", MySqlDbType.LongBlob).Value = arq.Imagem;
                    mComando.Parameters.Add("@tipo", MySqlDbType.VarChar).Value = arq.Tipo;
                    mComando.ExecuteNonQuery();
                    mComando.Dispose();
                }            
                mConexao.Close();
                mConexao.Dispose();
            }
        }
    }
    

    SQL Create Table SQL Server

    USE [App]
    GO
    
    /****** Object:  Table [dbo].[Imagens]    Script Date: 06/11/2013 11:17:06 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Imagens](
    	[Id] [int] IDENTITY(1,1) NOT NULL,
    	[Imagem] [image] NULL,
    	[Tipo] [nvarchar](50) NOT NULL,
     CONSTRAINT [PK_Imagens] PRIMARY KEY CLUSTERED 
    (
    	[Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    GO

    SQL Create Table Mysql

    delimiter $$
    
    CREATE TABLE `arquivos` (
      `Id` int(11) NOT NULL AUTO_INCREMENT,
      `Imagem` longblob,
      `Tipo` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`Id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8$$
    

    Seria isso eu fiz os teste e funciona que é uma beleza!!!


    Fúlvio Cezar Canducci Dias

    • Marcado como Resposta Giovani Cr quinta-feira, 14 de novembro de 2013 13:58
    quarta-feira, 6 de novembro de 2013 13:18

Todas as Respostas

  • Assim utiliza o LongBlob

    mas, eu acredito que terá que ler esse dados via codificação e passar novamente para o Mysql

    Assim

    Crie um programa em C# que vai ler os dados no SQL e passar para o Mysql será que assim não funciona???


    Fúlvio Cezar Canducci Dias

    quarta-feira, 6 de novembro de 2013 12:43
  • Será que daria em PHP? Os caras aqui não usam C#...o longblob não subiu, manteve o erro.
    quarta-feira, 6 de novembro de 2013 12:49
  • Será que daria em PHP? Os caras aqui não usam C#...o longblob não subiu, manteve o erro.
    Só testando cara! falando assim fica complicado!!! em C# poderia até fazer um teste !!!

    Fúlvio Cezar Canducci Dias

    quarta-feira, 6 de novembro de 2013 12:52
  • Ok, vou dar uma olhada com o pessoal de desenvolvimento e depois falo o que aconteceu. Obrigado.
    quarta-feira, 6 de novembro de 2013 12:56
  • Ok, vou dar uma olhada com o pessoal de desenvolvimento e depois falo o que aconteceu. Obrigado.

    Aqui ta um exemplo do código que eu mesmo fiz testado e funcional

    Classe que vai auxiliar o trafego da informação entre os bancos ...

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Img.ConsoleApplication
    {
        public class Arquivo
        {
            public int Id { get; set; }
            public byte[] Imagem { get; set; }
            public string Tipo { get; set; }
        }
    }

    Rotinas de Trafego entre os Bancos...

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using MySql;
    using MySql.Data;
    using MySql.Data.Types;
    using MySql.Data.MySqlClient;
    using System.Data.SqlClient;
    namespace Img.ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<Arquivo> arquivos = new List<Arquivo>();
                //ROTINA SQL SERVER
                SqlConnection Conexao = new SqlConnection(@"Data Source=.\SqlExpress;Initial Catalog=App;Persist Security Info=True;User ID=sa;Password=senha;MultipleActiveResultSets=True;Application Name=EntityFramework");
                Conexao.Open();
                SqlCommand Commando = Conexao.CreateCommand();
                Commando.CommandType = System.Data.CommandType.Text;
                Commando.CommandText = "SELECT [Id] ,[Imagem] ,[Tipo] FROM [App].[dbo].[Imagens]";
                SqlDataReader reader = Commando.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        arquivos.Add(new Arquivo()
                        {
                            Id = reader.GetInt32(0),
                            Imagem = reader.IsDBNull(1) == false ? (byte[])reader[1]: null,
                            Tipo = reader.GetString(2)
                        });
                    }
                }
                reader.Close();
                reader.Dispose();
                Commando.Dispose();
                Conexao.Close();
                Conexao.Dispose();
                //
                //ROTINA BANCO MYSQL
                MySqlConnection mConexao = new MySqlConnection(@"server=localhost;User Id=root;password=se;database=dbteste;Persist Security Info=True");
                mConexao.Open();
                foreach (Arquivo arq in arquivos)
                {
                    MySqlCommand mComando = mConexao.CreateCommand();
                    mComando.CommandType = System.Data.CommandType.Text;
                    mComando.CommandText = "INSERT INTO arquivos(imagem, tipo) values(@imagem, @tipo);";
                    mComando.Parameters.Add("@imagem", MySqlDbType.LongBlob).Value = arq.Imagem;
                    mComando.Parameters.Add("@tipo", MySqlDbType.VarChar).Value = arq.Tipo;
                    mComando.ExecuteNonQuery();
                    mComando.Dispose();
                }            
                mConexao.Close();
                mConexao.Dispose();
            }
        }
    }
    

    SQL Create Table SQL Server

    USE [App]
    GO
    
    /****** Object:  Table [dbo].[Imagens]    Script Date: 06/11/2013 11:17:06 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Imagens](
    	[Id] [int] IDENTITY(1,1) NOT NULL,
    	[Imagem] [image] NULL,
    	[Tipo] [nvarchar](50) NOT NULL,
     CONSTRAINT [PK_Imagens] PRIMARY KEY CLUSTERED 
    (
    	[Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    GO

    SQL Create Table Mysql

    delimiter $$
    
    CREATE TABLE `arquivos` (
      `Id` int(11) NOT NULL AUTO_INCREMENT,
      `Imagem` longblob,
      `Tipo` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`Id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8$$
    

    Seria isso eu fiz os teste e funciona que é uma beleza!!!


    Fúlvio Cezar Canducci Dias

    • Marcado como Resposta Giovani Cr quinta-feira, 14 de novembro de 2013 13:58
    quarta-feira, 6 de novembro de 2013 13:18