none
Gravar imagem no sql server. RRS feed

  • Pergunta

  • Pessoal estou enrolado...

     

    criei uma aplicação em camadas:

     

    classe de acesso:

     

    public void insParametros()

    {

    Conecta();

    SqlCommand k = new SqlCommand("INSERT INTO SYS_PARAMETROS (EMP_CNPJ,EMP_LOGO_CLI) VALUES (@cnpj, @EMP_LOGO_CLI)",sCon);

    k.Parameters.Add("@emp_Cnpj", SqlDbType.VarChar, 14);

    k.Parameters.Add("@emp_logo_cli", SqlDbType.Image);

    k.Parameters["@emp_Cnpj"].Value = Cnpj;

    k.Parameters["@emp_logo_cli"].Value = Logo_cli;

    try

    {

    // SqlCommand Command = new SqlCommand(k, sCon);

    k.ExecuteNonQuery();

    }

    catch (SqlException ex)

    {

    throw ex;

    }

    finally

    {

    Desconecta();

    }

    }

     

     

     

    classe interface:

     

     

              byte[] imagemEmBytes = null;

              ....

    clpParametros par = new clpParametros();

    par.Logo_cli = imagemEmBytes;

              par.insParametros();

     

     

    da um erro de conversao

     

     

    Alguem pode me ajudar????

    sábado, 11 de outubro de 2008 13:02

Todas as Respostas

  • MOF,

     

    Eu tenho um exemplo em VB.NET para gravar e exibir uma imagem armazenada no banco de dados SQL Server Compact (Precisa apenas alterar o provider para SQL Server)

     

    Veja se ajuda:

     

    Code Snippet

    Option Explicit On

    Option Strict On

    'provider do banco de dados

    Imports System.Data.SqlServerCe

    Imports System.Data

    'outros

    Imports System.Text 'StringBuilder

    Imports System.Configuration 'ConnectionStrings

    Imports System.IO 'Path.Combine

     

     

    Carregando:

    Code Snippet

    Private Sub CarregarImagem(ByVal strCountryID As String)

    '

    'carregando a imagem do banco de dados

    '

    Try

    'definindo a string de conexÆo do banco de dados

    Dim strConexao As String = _

    ConfigurationManager.ConnectionStrings("SQLServerCompact").ToString

    Dim oConn As New SqlCeConnection(strConexao)

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

    Dim oCmd As SqlCeCommand = Nothing

    strSQL.Append("SELECT ")

    strSQL.Append(" Flag ")

    strSQL.Append(" FROM Country ")

    strSQL.Append(" WHERE CountryID = @CountryID ")

    'abrir conexÆo

    oConn.Open()

    'definindo os parƒmetros do SqlCommand

    oCmd = New SqlCeCommand(strSQL.ToString, oConn)

    oCmd.CommandType = CommandType.Text

    oCmd.Parameters.Add(New _

    SqlCeParameter("@CountryID", SqlDbType.NChar, 3)).Value = strCountryID

    'carregando os dados do banco de dados

    Dim oDataReader As SqlCeDataReader = _

    oCmd.ExecuteReader(CommandBehavior.CloseConnection)

    'limpar a imagem corrente

    picImagem.Image = Nothing

    picImagem.Refresh()

    oDataReader.Read()

    If Not (oDataReader("Flag") Is DBNull.Value) Then

    Dim bits As Byte() = CType(oDataReader("Flag"), Byte())

    Dim memorybits As New MemoryStream(bits)

    Dim oBitmap As New Bitmap(memorybits)

    picImagem.Image = oBitmap

    picImagem.Refresh()

    'liberando os objetos

    oConn.Dispose()

    oCmd.Dispose()

    oDataReader.Dispose()

    End If

    Catch ex As SqlCeException

    MessageBox.Show(ex.Message, "erro ao carregar a imagem do banco de dados.", MessageBoxButtons.OK, MessageBoxIcon.Information)

    picImagem.Image = Nothing

    picImagem.Refresh()

    End Try

    End Sub

     

     

     

    Salvando:

    Code Snippet

     

    Private Function GravarImagem(ByVal strCountryID As String) As Boolean

    '

    'carregando a imagem do banco de dados

    '

    Try

    'caminho completo da imagem a ser gravada no banco de dados

    Dim strImagem As String = txtPath.Text

    If (String.IsNullOrEmpty(strImagem)) Then

    MessageBox.Show("Informe a imagem a ser gravada no banco de dados.", "Salvar Imagem", MessageBoxButtons.OK, MessageBoxIcon.Information)

    Else

    'carregando a imagem

    Dim fsImagem As FileStream

    fsImagem = New FileStream(strImagem, FileMode.Open)

    Dim fiImagem As FileInfo = New FileInfo(strImagem)

    Dim l As Long = fiImagem.Length

    Dim lung As Long = Convert.ToInt32(fiImagem.Length)

    Dim picture(CType(fiImagem.Length, Integer)) As Byte

    fsImagem.Read(picture, 0, CType(fiImagem.Length, Integer))

    fsImagem.Close()

    'definindo a string de conexÆo do banco de dados

    Dim strConexao As String = _

    ConfigurationManager.ConnectionStrings("SQLServerCompact").ToString

    Dim oConn As New SqlCeConnection(strConexao)

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

    Dim oCmd As SqlCeCommand = Nothing

    strSQL.Append("UPDATE Country ")

    strSQL.Append(" SET Flag = @Flag ")

    strSQL.Append(" WHERE CountryID = @CountryID ")

    'abrir conexÆo

    oConn.Open()

    'definindo os parƒmetros do SqlCommand

    oCmd = New SqlCeCommand(strSQL.ToString, oConn)

    oCmd.CommandType = CommandType.Text

    oCmd.Parameters.Add(New _

    SqlCeParameter("@Flag", SqlDbType.Image)).Value = picture

    oCmd.Parameters.Add(New _

    SqlCeParameter("@CountryID", SqlDbType.NChar, 3)).Value = strCountryID

    'atualizando os dados no banco de dados

    oCmd.ExecuteNonQuery()

    'liberando os objetos

    oConn.Close()

    oCmd.Dispose()

    MessageBox.Show("Registro atualizado com sucesso no banco de dados.", "Salvar Imagem", MessageBoxButtons.OK, MessageBoxIcon.Information)

    End If

    Catch ex As SqlCeException

    MessageBox.Show(ex.Message, "erro ao atualizar a imagem do banco de dados.", MessageBoxButtons.OK, MessageBoxIcon.Information)

    Return False

    End Try

    End Function

     

     

     

    [ ]'s

     

    Laércio

     

    sábado, 11 de outubro de 2008 15:38
  • Meu amigo, boa tarde.

     

    O codio eu tenho, o problema é que quando vou repassar o campo da um erro de conversao.

     

    não estou sabendo converter byte em byte[].

     

    no meu banco o campo esta definido como image;

    na minha classe o metodo esta definido como byte;

     ai quando tento enviar da classe de interface para o dados da erro de conversão.

     

     

    é esse meu problema.

     

    sábado, 11 de outubro de 2008 16:07
  • Mof,

     

    Bom Dia!

     

    Tente utilizar esta função para converter a imagem:

     

    Função para conversão
    Imports System.IO
    Public Class util
        Public Shared Function ConverterImagemEmByteArray(ByVal imageToConvert As System.Drawing.Image) As Byte()
            Dim Ret() As Byte
            Using ms As New MemoryStream()
                imageToConvert.Save(ms, imageToConvert.RawFormat)
                Ret = ms.ToArray
                ConverterImagemEmByteArray = Ret
            End Using
        End Function
    End Class

     

     

     

    segunda-feira, 13 de outubro de 2008 12:53
  • Valeu, vou converter pra c#.

     

    vou testar.

     

    segunda-feira, 13 de outubro de 2008 15:49
  • MOF,

     

    Se precisar, o código em C está abaixo:

     

    Função para converter imagem em ByteArray

    using System.IO;
    public class util
    {
        public static byte[] ConverterImagemEmByteArray(System.Drawing.Image imageToConvert)
        {
            byte[] functionReturnValue = null;
            byte[] Ret = null;
            using (MemoryStream ms = new MemoryStream()) {
                imageToConvert.Save(ms, imageToConvert.RawFormat);
                Ret = ms.ToArray;
                functionReturnValue = Ret;
            }
            return functionReturnValue;
        }
    }

     

     

    segunda-feira, 13 de outubro de 2008 22:25
  • Valeu meu amigo, vou testar.

     

    terça-feira, 14 de outubro de 2008 11:52
  • Vê se você pode me ajudar.

     

    eu tenho uma aplicação em 2 camadas.

     

    A Primeira:

     

    public class clpParametros : clpAcesso

    {

    #region Propriedades e campos

    private string _cnpj;

    public string Cnpj

    {

    get { return _cnpj; }

    set { _cnpj = value; }

    }

    private string _razao_social;

    public string Razao_social

    {

    get { return _razao_social; }

    set { _razao_social = value; }

    }

    private byte _logo_cli;

    public byte Logo_cli

    {

    get { return _logo_cli; }

    set { _logo_cli = value; }

    }

    private byte _logo_sof;

    public byte Logo_sof

    {

    get { return _logo_sof; }

    set { _logo_sof = value; }

    }

    #endregion

     

    public void insParametros()

    {

    Conecta();

    SqlCommand k = new SqlCommand("INSERT INTO SYS_PARAMETROS (EMP_CNPJ,EMP_LOGO_CLI) VALUES (@cnpj, @EMP_LOGO_CLI)",sCon);

    k.Parameters.Add("@emp_Cnpj", SqlDbType.VarChar, 14);

    k.Parameters.Add("@emp_logo_cli", SqlDbType.Image);

    k.Parameters["@emp_Cnpj"].Value = Cnpj;

    k.Parameters["@emp_logo_cli"].Value = Logo_cli;

    try

    {

    // SqlCommand Command = new SqlCommand(k, sCon);

    k.ExecuteNonQuery();

    }

    catch (SqlException ex)

    {

    throw ex;

    }

    finally

    {

    Desconecta();

    }

    }

     

    so que na camada interface :

     

     

                       byte[] imagemEmBytes = null

    ...

     

                        clpParametros par = new clpParametros();

                        par.Logo_cli = Convert.ToByte(imagemEmBytes);
                        par.insParametros();

     

    quando eu tento gravar, não vai.

     

     

    eu preciso de uma conversão de byte[] para byte.

     

    ve se pode me ajudar amigo.

     

    terça-feira, 14 de outubro de 2008 12:05