none
Buscar dados em bytes no banco RRS feed

  • Pergunta

  • Bom dia

    Pessoal com a ajuda aqui do fórum consegui armazenar um valor tipo byte[] no access deixando campo do access no formato Objeto OLE.

    Sei que os dados estão armazenados corretamente porque quando faço uma busca no banco e retorno os dados para uma variável esta ok.

    Porém agora tenho uma dúvida, vamos supor que meu sistema recebe uma variável do tipo byte[] e preciso fazer uma consulta no banco para saber se essa variável já esta armazenada. Como eu faria isso? Tentei jogando uma query simples mas não rolo, só para demonstrar segue como estou armazenando:

    string strcon = "Provider=Microsoft.ACE.OLEDB.12.0;Data source=.\\banco.accdb";
                string sql = "INSERT INTO tabela(campo) VALUES (?)";
                OleDbConnection conexao = new OleDbConnection(strcon);
                OleDbCommand comando = new OleDbCommand(sql, conexao);
    
    comando.Parameters.Add("@teste", OleDbType.Binary,variavel_byte.Length).Value = variavel_byte;
    
    conexao.Open();
    	            comando.ExecuteNonQuery();
    	            conexao.Close();
                    MessageBox.Show("salvo");


    sexta-feira, 15 de março de 2013 14:12

Respostas

  • Campo binary nao é indexavel, portanto vc nao pode utiliza-lo como clausula where.

    Formas de contornar isso:

    Crie um segundo campo com o HASH do conteudo binario e (campo varchar) e depois faça a pesquisa usando o hash.

    Para criar um hash faça assim:

    string hash;
    using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
    {
        hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
    }

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    • Marcado como Resposta Alexandre CCarmo sexta-feira, 15 de março de 2013 19:42
    sexta-feira, 15 de março de 2013 18:21
    Moderador

Todas as Respostas

  • Olá,

    É só fazer um SELECT COUNT passando seu vetor como parâmetro:

    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "select count(*) from SUA_TABELA where SEU_CAMPO = @arquivo";
    cmdParameters.Add("@arquivo", OleDbType.Binary).Value = array;
    
    var n = (int)cmd.ExecuteScalar();
    

    sexta-feira, 15 de março de 2013 14:37
  • Bom dia Israel, obrigado pela ajuda.

    Eu não entendi essa parte:

    var n = (int)cmd.ExecuteScalar();

    E outra dúvida seria, depois de executar esses comandos como eu faria para saber se encontrou ou não o resultado no banco de dados?

    sexta-feira, 15 de março de 2013 14:43
  • Não consegui fazer da forma que o Israel passou então tentei conforme exemplo abaixo mas ele não me retorna nada. Alguém tem ideia de onde pode estar o erro?

    string strcon = "Provider=Microsoft.ACE.OLEDB.12.0;Data source=.\\banco.accdb";
                  
                    string query = "SELECT  * from tabela where campo=(?)" ;
    
                    OleDbConnection conexao = new OleDbConnection(strcon);
                    OleDbCommand cmdConsulta = new OleDbCommand(query, conexao);
    
                    cmdConsulta.Parameters.Add("@dados", OleDbType.Binary).Value = (byte[])variavel_byte;
                  
    
                    conexao.Open();
                    OleDbDataReader dr = null;
    
                    dr = cmdConsulta.ExecuteReader();
                 
                    while (dr.Read())
                    {
                        MessageBox.Show(dr.GetValue(0).ToString());
                    }

    sexta-feira, 15 de março de 2013 16:33
  • Campo binary nao é indexavel, portanto vc nao pode utiliza-lo como clausula where.

    Formas de contornar isso:

    Crie um segundo campo com o HASH do conteudo binario e (campo varchar) e depois faça a pesquisa usando o hash.

    Para criar um hash faça assim:

    string hash;
    using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
    {
        hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
    }

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    • Marcado como Resposta Alexandre CCarmo sexta-feira, 15 de março de 2013 19:42
    sexta-feira, 15 de março de 2013 18:21
    Moderador