none
Access - ExecuteNonQuery RRS feed

  • Pergunta

  • Bom, venho pedir ajuda à vocês pois estou a muito tempo procurando solucionar meu problema, mas não encontro nenhuma solução...

    O problema é, que uso banco de dados Access e estou desenvolvendo uma página Asp.Net.

    Adicionei todos os parâmetros necessários, e deixei de acordo com minha tabela do BD.

    Mas, quando executo o código, completo todos os campos e clico no botão enviar, ele dá um erro no "cmd.ExecuteNonQuery();" e aparece na mensagem de erro somente "Sobrecarga"...

    Preciso de ajuda o mais rápido possível... pois tenho certa urgência em conseguir rodar esse código.

    Agradeço desde já, e aguardo respostas.

    Bruno Caetano

    ## CÓDIGO ##

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data.Sql;
    using System.Data.SqlClient;
    using System.Data.Common;
    using System.Data.ProviderBase;
    using System.Data.OleDb;

    namespace Projeto
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
            }

            protected void Button4_Click(object sender, EventArgs e)
            {
                txtNome.Text = "";
                txtRg.Text = "";
                txtCpf.Text = "";
                txtNascimento.Text = "";
                txtEndereço.Text = "";
                txtEmail.Text = "";
            }

            protected void btnEnviar_Click(object sender, EventArgs e)
            {
                {
                    OleDbConnection cn = new OleDbConnection(@"Data Source='C:\Documents and Settings\Bruno.E16839B12B9D407\Meus documentos\Visual Studio 2008\Projects\Projeto\Projeto\bd1.mdb';Persist Security Info=True; Provider=Microsoft.Jet.OLEDB.4.0");

                    OleDbCommand cmd = new OleDbCommand("INSERT INTO CADASTRO_CLIENTE ( NOME , RG , CPF , EMAIL , ENDERECO , DT_NASC ) VALUES ( @NOME , @RG , @CPF , @EMAIL , @ENDERECO , @DT_NASC )", cn);
                    cmd.Parameters.Add(new OleDbParameter("@NOME", txtNome.Text));
                    cmd.Parameters.Add(new OleDbParameter("@RG", txtRg.Text));
                    cmd.Parameters.Add(new OleDbParameter("@CPF", txtCpf.Text));
                    cmd.Parameters.Add(new OleDbParameter("@EMAIL", txtEmail.Text));
                    cmd.Parameters.Add(new OleDbParameter("@ENDERECO", txtEndereço.Text));
                    cmd.Parameters.Add(new OleDbParameter("@DT_NASC", txtNascimento.Text));

                    cn.Open();

                    cmd.ExecuteNonQuery();
                    Label1.Text = ("O registro foi inserido com sucesso.");

                    cn.Close();
                }
            }
        }
    }
    terça-feira, 18 de novembro de 2008 21:26

Respostas

  • Bruno,

    a forma de se passar parâmetros com o OleDb é um pouco diferente da forma utilizada com o SqlClient Data Provider. Veja:

    http://thespoke.net/blogs/oneda/archive/2005/03/08/125949.aspx

     


    Ricardo Oneda
    http://oneda.mvps.org/blog

    quarta-feira, 19 de novembro de 2008 10:40
  • Bruno,

    no caso do OleDb, os parâmetros que ficam na query não têm nome (usa-se o ? como você fez). Mas na hora de instanciar os objetos do tipo OleDbParameter, você pode usar um nome, não precisa por o ?. O importante é que a ordem em que os parâmetros são inseridos deve ser a mesma em que eles aparecem na query, já que não haverá nome para ligar os dois.

     


    Ricardo Oneda
    http://oneda.mvps.org/blog

    quarta-feira, 19 de novembro de 2008 15:26
  • Bruno,

     

    o resultado do método ExecuteReader() deve ser atribuído a um objeto do tipo DataReader, por ex:

     

    Code Snippet
    SqlDataReader dr = cmd.ExecuteReader();

     

     

     

    Se sua query não retorna nenhum resultado, utilize o método ExecuteNonQuery() ao invés do ExecuteReader();

     


    Ricardo Oneda
    http://oneda.mvps.org/blog

    domingo, 23 de novembro de 2008 15:13
  • Olá Bruno,

     

    O primeiro trecho de código realmente não deveria funcionar, já que você está utilizando o método ExecuteReader, em uma instrução que não retorna registros...

     

    No entanto, o segundo trecho de código me parece que não tem motivos para funcionar. Pelo menos na simulação que fiz aqui, funcionou!

     

    Você pode mostrar qual é a mensagem de erro detalhada, e qual é a estrutura da tabela CADASTRO_CLIENTE?

     

    Para simular o seu cenário aqui em minha máquina, criei um banco de dados Access com uma tabela de mesmo nome, e com os mesmos campos. Você pode fazer o download desse arquivo MDB através do link abaixo:

    http://www.rapidshare.com.cn/download.php?id=81537F441

     

    O código que usei, foi praticamente o mesmo que o que você utilizou acima, exceto pelos valores das caixas de texto, que para facilitar, coloquei valores fixos:

     

    Code Snippet

     

     OleDbConnection cn = new OleDbConnection(@"Data Source='C:\db1.mdb';Persist Security Info=True; Provider=Microsoft.Jet.OLEDB.4.0");

     using (cn)

     {

    OleDbCommand cmd = new OleDbCommand("INSERT INTO CADASTRO_CLIENTE (NOME , RG , CPF , EMAIL , ENDERECO , DT_NASC ) VALUES ( ? , ? , ? , ? , ? , ? )", cn);

     

    cmd.Parameters.Add(new OleDbParameter("NOME", "Caio Proiete"));

    cmd.Parameters.Add(new OleDbParameter("RG", "99.999.999-9"));

    cmd.Parameters.Add(new OleDbParameter("CPF", "999.999.999-99"));

    cmd.Parameters.Add(new OleDbParameter("EMAIL", "caio@email.com"));

    cmd.Parameters.Add(new OleDbParameter("ENDERECO", "Rua Joao da Silva, 45"));

    cmd.Parameters.Add(new OleDbParameter("DT_NASC", "1960-05-10"));

    cn.Open();

     

    int registrosInseridos = cmd.ExecuteNonQuery();

     

    MessageBox.Show("Registros inseridos = " + registrosInseridos.ToString());

     }

     

     

    Veja se você consegue executar o código acima com sucesso, e em caso negativo, diga-nos a mensagem de erro detalhada.

     

    Abraços,
    Caio Proiete

    segunda-feira, 24 de novembro de 2008 11:03
    Moderador
  • Olá Bruno,

     

    Assumindo que todos os campos são do tipo texto, exceto o campo DT_NASC que deve ser do tipo DateTime (imagino),  a única razão que vejo para acontecer esse erro, é o formato de data estar sendo rejeitado pelo Access.

     

    Assim, creio que o mais seguro seja converter o valor que está na caixa de texto para o tipo DateTime do .NET, e então enviar para o banco de dados... Algo como:

     

    Code Snippet

     

     // ...

     

     // Converte a data de nascimento que está na caixa de texto

     // para o formato DateTime do .NET, assumindo o formato dd/MM/yyyy

     DateTime dataNascimento = DateTime.ParseExact(txtNascimento.Text,

    "dd/MM/yyyy", CultureInfo.InvariantCulture);

     

     cmd.Parameters.Add(new OleDbParameter("DT_NASC", dataNascimento));

     

     // ...

     

     

    Abraços,
    Caio Proiete

    segunda-feira, 24 de novembro de 2008 12:03
    Moderador

Todas as Respostas

  • Bruno,

    a forma de se passar parâmetros com o OleDb é um pouco diferente da forma utilizada com o SqlClient Data Provider. Veja:

    http://thespoke.net/blogs/oneda/archive/2005/03/08/125949.aspx

     


    Ricardo Oneda
    http://oneda.mvps.org/blog

    quarta-feira, 19 de novembro de 2008 10:40
  • Muito obrigado por me ajudar Ricardo.

    Mas, tentei colocar "?" em vez dos parâmetros que usei, e continuou com o mesmo erro.

    Não sei se coloquei certo os parâmetros, mas, se não coloquei certo, seria "?NOME" ?

    Imagem do Erro : http://img352.imageshack.us/img352/9260/errovn7.jpg

    Obrigado desde já.

    Bruno

    ## CÓDIGO ##

                {
                    OleDbConnection cn = new OleDbConnection(@"Data Source='C:\Documents and Settings\Bruno.E16839B12B9D407\Meus documentos\Visual Studio 2008\Projects\Projeto\Projeto\bd1.mdb';Persist Security Info=True; Provider=Microsoft.Jet.OLEDB.4.0");

                    OleDbCommand cmd = new OleDbCommand("INSERT INTO CADASTRO_CLIENTE ( NOME , RG , CPF , EMAIL , ENDERECO , DT_NASC ) VALUES ( ? , ? , ? , ? , ? , ? )", cn);
                    cmd.Parameters.Add(new OleDbParameter("?", txtNome.Text));
                    cmd.Parameters.Add(new OleDbParameter("?", txtRg.Text));
                    cmd.Parameters.Add(new OleDbParameter("?", txtCpf.Text));
                    cmd.Parameters.Add(new OleDbParameter("?", txtEmail.Text));
                    cmd.Parameters.Add(new OleDbParameter("?", txtEndereço.Text));
                    cmd.Parameters.Add(new OleDbParameter("?", txtNascimento.Text));

                    cn.Open();

                    cmd.ExecuteReader();
                    Label1.Text = ("O registro foi inserido com sucesso.");

                    cn.Close();
                }

    quarta-feira, 19 de novembro de 2008 15:12
  • Bruno,

    no caso do OleDb, os parâmetros que ficam na query não têm nome (usa-se o ? como você fez). Mas na hora de instanciar os objetos do tipo OleDbParameter, você pode usar um nome, não precisa por o ?. O importante é que a ordem em que os parâmetros são inseridos deve ser a mesma em que eles aparecem na query, já que não haverá nome para ligar os dois.

     


    Ricardo Oneda
    http://oneda.mvps.org/blog

    quarta-feira, 19 de novembro de 2008 15:26
  • Ricardo, já consertei e adequei meu código de acordo com sua ajuda, mas, o erro de Sobrecarga ainda persiste no comando...

    Tem como solucionar isso?

    Obrigado, até mais.

    Bruno.
    quarta-feira, 19 de novembro de 2008 16:29
  • Bruno,

    mas não dá nenhuma mensagem de erro mais detalhada?

     


    Ricardo Oneda
    http://oneda.mvps.org/blog

    sexta-feira, 21 de novembro de 2008 10:20
  • Não, apenas aparece o comando em verde e a mensagem escrito "Sobrecarga".

    Imagem do Erro : http://img352.imageshack.us/img352/9260/errovn7.jpg

    Já estou a 1 semana tentando resolver isso... e até perdi o curso Students To Bussiness por causa dele...

    Até mais, se puder me ajudar nisso agradeceria muito.

    Bruno.
    sexta-feira, 21 de novembro de 2008 10:25
  • Ninguém sabe como resolver isso?

    Pois preciso muito de ajuda.

    Até mais
    sábado, 22 de novembro de 2008 11:26
  • Bruno,

     

    o resultado do método ExecuteReader() deve ser atribuído a um objeto do tipo DataReader, por ex:

     

    Code Snippet
    SqlDataReader dr = cmd.ExecuteReader();

     

     

     

    Se sua query não retorna nenhum resultado, utilize o método ExecuteNonQuery() ao invés do ExecuteReader();

     


    Ricardo Oneda
    http://oneda.mvps.org/blog

    domingo, 23 de novembro de 2008 15:13
  • Ricardo,

    Já tentei desse jeito, já troquei pelo ExecuteNonQuery() , mas todos me levam ao mesmo erro...

    Muito estranho isso, está muito difícil de resolver, já procurei ajuda em muitos lugares, mas nada de solução ainda.

    Minha última esperança é aqui mesmo...

    Até mais e obrigado,

    Bruno
    domingo, 23 de novembro de 2008 22:29
  • Olá Bruno,

     

    Você pode mostrar exatamente o código que você está utilizando (com as adaptações que você fez nos nomes dos parâmetros)?

     

    Abraços,
    Caio Proiete

     

    domingo, 23 de novembro de 2008 23:10
    Moderador
  • Olá Caio,

    Meu código ficou o seguinte (de acordo com o que o Ricardo disse):

    Code Snippet


    {     

               
    OleDbConnection cn = new OleDbConnection(@"Data Source='C:\Documents
    and Settings\Bruno.E16839B12B9D407\Meus documentos\Visual Studio
    2008\Projects\Projeto\Projeto\bd1.mdb';Persist Security Info=True;
    Provider=Microsoft.Jet.OLEDB.4.0");

                   
    OleDbCommand cmd = new OleDbCommand("INSERT INTO CADASTRO_CLIENTE (NOME , RG , CPF , EMAIL , ENDERECO , DT_NASC ) VALUES ( ? , ? , ? , ? , ? , ? )", cn);


                    cmd.Parameters.Add(new OleDbParameter("NOME", txtNome.Text));

                    cmd.Parameters.Add(new OleDbParameter("RG", txtRg.Text));

                    cmd.Parameters.Add(new OleDbParameter("CPF", txtCpf.Text));

                    cmd.Parameters.Add(new OleDbParameter("EMAIL", txtEmail.Text));

                    cmd.Parameters.Add(new OleDbParameter("ENDERECO", txtEndereço.Text));

                    cmd.Parameters.Add(new OleDbParameter("DT_NASC", txtNascimento.Text));



                    cn.Open();



                    OleDbDataReader dr = cmd.ExecuteReader();

                    Label1.Text = ("O registro foi inserido com sucesso.");



                    cn.Close();

    }


     E aqui é o código em que eu coloquei ExecuteNonQuery():
    Code Snippet


    {


    OleDbConnection cn = new OleDbConnection(@"Data Source='C:\Documents and Settings\Bruno.E16839B12B9D407\Meus documentos\Visual Studio 2008\Projects\Projeto\Projeto\bd1.mdb';Persist Security Info=True; Provider=Microsoft.Jet.OLEDB.4.0");     

    OleDbCommand cmd = new OleDbCommand("INSERT INTO CADASTRO_CLIENTE
    (NOME , RG , CPF , EMAIL , ENDERECO , DT_NASC ) VALUES ( ? , ? , ? , ? , ? , ? )", cn);


                    cmd.Parameters.Add(new OleDbParameter("NOME", txtNome.Text));


                    cmd.Parameters.Add(new OleDbParameter("RG", txtRg.Text));

                    cmd.Parameters.Add(new OleDbParameter("CPF", txtCpf.Text));

                    cmd.Parameters.Add(new OleDbParameter("EMAIL", txtEmail.Text));

                    cmd.Parameters.Add(new OleDbParameter("ENDERECO", txtEndereço.Text))

                    cmd.Parameters.Add(new OleDbParameter("DT_NASC", txtNascimento.Text));

                    cn.Open();

                    cmd.ExecuteNonQuery();

                    Label1.Text = ("O registro foi inserido com sucesso.");

                    cn.Close();

    }


    Espero que possam me ajudar.

    Até mais,

    Bruno

    segunda-feira, 24 de novembro de 2008 10:30
  • Olá Bruno,

     

    O primeiro trecho de código realmente não deveria funcionar, já que você está utilizando o método ExecuteReader, em uma instrução que não retorna registros...

     

    No entanto, o segundo trecho de código me parece que não tem motivos para funcionar. Pelo menos na simulação que fiz aqui, funcionou!

     

    Você pode mostrar qual é a mensagem de erro detalhada, e qual é a estrutura da tabela CADASTRO_CLIENTE?

     

    Para simular o seu cenário aqui em minha máquina, criei um banco de dados Access com uma tabela de mesmo nome, e com os mesmos campos. Você pode fazer o download desse arquivo MDB através do link abaixo:

    http://www.rapidshare.com.cn/download.php?id=81537F441

     

    O código que usei, foi praticamente o mesmo que o que você utilizou acima, exceto pelos valores das caixas de texto, que para facilitar, coloquei valores fixos:

     

    Code Snippet

     

     OleDbConnection cn = new OleDbConnection(@"Data Source='C:\db1.mdb';Persist Security Info=True; Provider=Microsoft.Jet.OLEDB.4.0");

     using (cn)

     {

    OleDbCommand cmd = new OleDbCommand("INSERT INTO CADASTRO_CLIENTE (NOME , RG , CPF , EMAIL , ENDERECO , DT_NASC ) VALUES ( ? , ? , ? , ? , ? , ? )", cn);

     

    cmd.Parameters.Add(new OleDbParameter("NOME", "Caio Proiete"));

    cmd.Parameters.Add(new OleDbParameter("RG", "99.999.999-9"));

    cmd.Parameters.Add(new OleDbParameter("CPF", "999.999.999-99"));

    cmd.Parameters.Add(new OleDbParameter("EMAIL", "caio@email.com"));

    cmd.Parameters.Add(new OleDbParameter("ENDERECO", "Rua Joao da Silva, 45"));

    cmd.Parameters.Add(new OleDbParameter("DT_NASC", "1960-05-10"));

    cn.Open();

     

    int registrosInseridos = cmd.ExecuteNonQuery();

     

    MessageBox.Show("Registros inseridos = " + registrosInseridos.ToString());

     }

     

     

    Veja se você consegue executar o código acima com sucesso, e em caso negativo, diga-nos a mensagem de erro detalhada.

     

    Abraços,
    Caio Proiete

    segunda-feira, 24 de novembro de 2008 11:03
    Moderador
  • Caio,

    Deixei o código como você disse acima (com valores fixos) e deu certo, mas, gostaria de executar ele com valores de caixas de texto, já que será um cadastro. Tentei com o seguinte código :

            {
                OleDbConnection cn = new OleDbConnection(@"Data Source='C:\db2.mdb';Persist Security Info=True; Provider=Microsoft.Jet.OLEDB.4.0");     
                using (cn)
                {

                    OleDbCommand cmd = new OleDbCommand("INSERT INTO CADASTRO_CLIENTE (NOME , RG , CPF , EMAIL , ENDERECO , DT_NASC ) VALUES ( ? , ? , ? , ? , ? , ? )", cn);

                    cmd.Parameters.Add(
    new OleDbParameter("NOME", txtNome.Text));

                    cmd.Parameters.Add(
    new OleDbParameter("RG", txtRg.Text));

                    cmd.Parameters.Add(
    new OleDbParameter("CPF", txtCpf.Text));

                    cmd.Parameters.Add(
    new OleDbParameter("EMAIL", txtEmail.Text));

                    cmd.Parameters.Add(
    new OleDbParameter("ENDERECO", txtEndereço.Text));

                    cmd.Parameters.Add(
    new OleDbParameter("DT_NASC", txtNascimento.Text));

                    cn.Open();

                   
    int registrosInseridos = cmd.ExecuteNonQuery();

                    Label1.Text = ("Registros inseridos = " + registrosInseridos.ToString( ));

                }
            }

    Mas ele me retornou um erro dizendo : "Tipo de dados incompatível com a expressão de critério"

    Imagem do erro : http://img211.imageshack.us/img211/7273/erroat2.jpg

    Bem, é isso, se você tentar resolver esse código, agradeceria muito, e me ajudaria muito também.

    Até mais,

    Agradeço desde já,

    Bruno
    segunda-feira, 24 de novembro de 2008 11:52
  • Olá Bruno,

     

    Assumindo que todos os campos são do tipo texto, exceto o campo DT_NASC que deve ser do tipo DateTime (imagino),  a única razão que vejo para acontecer esse erro, é o formato de data estar sendo rejeitado pelo Access.

     

    Assim, creio que o mais seguro seja converter o valor que está na caixa de texto para o tipo DateTime do .NET, e então enviar para o banco de dados... Algo como:

     

    Code Snippet

     

     // ...

     

     // Converte a data de nascimento que está na caixa de texto

     // para o formato DateTime do .NET, assumindo o formato dd/MM/yyyy

     DateTime dataNascimento = DateTime.ParseExact(txtNascimento.Text,

    "dd/MM/yyyy", CultureInfo.InvariantCulture);

     

     cmd.Parameters.Add(new OleDbParameter("DT_NASC", dataNascimento));

     

     // ...

     

     

    Abraços,
    Caio Proiete

    segunda-feira, 24 de novembro de 2008 12:03
    Moderador

  • Olá Caio,

    Para funcionar esse código eu tenho que declarar algum outro Namespace? Ou alguma variável?

    Pois aqui o VWD diz que "CultureInfo" não existe.

    Até mais,

    Bruno
    segunda-feira, 24 de novembro de 2008 12:24
  • Sim, com certeza.

     

    A classe CultureInfo está no namespace System.Globalization.

     

    Abraços,

    Caio Proiete

    segunda-feira, 24 de novembro de 2008 12:30
    Moderador

  • Caio,

    Muito obrigado, meu problema finalmente foi solucionado, agradeço muito sua ajuda, pois à 2 semanas tento resolver ele.

    Até mais,

    Obrigado novamente,

    Bruno


    segunda-feira, 24 de novembro de 2008 12:46
  • Excelente! Wink
    segunda-feira, 24 de novembro de 2008 14:24
    Moderador