Usuário com melhor resposta
Access - ExecuteNonQuery

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();
}
}
}
}
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 -
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 -
Bruno,
o resultado do método ExecuteReader() deve ser atribuído a um objeto do tipo DataReader, por ex:
Code SnippetSqlDataReader 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 -
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 SnippetOleDbConnection 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 -
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
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 -
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();
} -
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 -
-
-
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. -
-
Bruno,
o resultado do método ExecuteReader() deve ser atribuído a um objeto do tipo DataReader, por ex:
Code SnippetSqlDataReader 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 -
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 -
-
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 -
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 SnippetOleDbConnection 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 -
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 -
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 -
-
-
-