none
Comando insert não grava no banco ACCES RRS feed

  • Pergunta

  • Boa Noite 
    Estou desenvolvendo um mini aplicativo de contas a pagar Windows form em 3 CAMADAS com banco Acces

    o comando insert não esta gravando no banco acces, nas texbox digito e quando clico no botão gravar ele vai para a grid, mas ao fechar o programa e reabri-lo os registros simplesmente não estão lá, ou seja não foi gravado nada, abaixo um pouco do código da classe DAL.

     public void gravaFornecedor(ControleMODEL fornecedor)
            {
    
                try
                {
                    conexao = new OleDbConnection(conexao_acces);
                    OleDbCommand sql = new OleDbCommand("INSERT INTO fornecedores VALUES (@CodFornecedor,@Nome_Fornecedor)", conexao);
    
                    conexao.Open();
                    
                    sql.Parameters.AddWithValue("@CodFornecedor",fornecedor.Codigo);
                    sql.Parameters.AddWithValue("@Nome_Fornecedor", fornecedor.Fornecedor);
                    
                    sql.ExecuteNonQuery();
                    conexao.Close();
                }
                catch (OleDbException ex)
                {
                    throw new ApplicationException(ex.ToString());
                }
                finally
                {
                    conexao.Close();
                }
    
            }
    


    terça-feira, 25 de outubro de 2011 23:00

Respostas

  • Agora Consegui o código é esse

     private void btnNovo_Click(object sender, EventArgs e)
            {
                try
                {
                    precosMODEL obj_controle = new precosMODEL();
    
                    obj_controle.IDControle = Convert.ToInt32(tb_codigo.Text);
                    obj_controle.Fornecedor = tb_Descricao.Text;
                    obj_controle.Valor = Convert.ToDouble(tb_Preco.Text);
                    obj_controle.DataVenc = Convert.ToDateTime(tbmsDataTransf.Text);
             
                    precosBLL controlebll = new precosBLL();
                    controlebll.gravaPrecosDal(obj_controle);
                    MessageBox.Show("REGISTRO gravado com sucesso! ","ATENÇÃO!!!",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
                    povoa_grade();
    
                    tbPesquisa.Text = "";
                    tb_codigo.Text = "";
                    tb_Descricao.Text = "";
                    tb_Preco.Text = "";
                    tbmsDataTransf.Text = "";
    
                }
                catch (Exception erro)
                {
                    MessageBox.Show("Erro ao gravar O REGISTRO!!! " + erro);
                }
            }
    


    quinta-feira, 27 de outubro de 2011 20:56

Todas as Respostas

  • Boa noite, WRServices.

    Fiz algumas alterações no código acima:

            public void gravaFornecedor()
            {
    
                OleDbConnection conexao = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\teste.mdb; User Id=; Password=");
    
                try
                {               
                    conexao.Open();
    
                    OleDbCommand sql = new OleDbCommand("INSERT INTO fornecedor VALUES (@Cd_Fornecedor,@Nm_Fornecedor)", conexao);                             
    
                    sql.Parameters.AddWithValue("@Cd_Fornecedor", "1");
                    sql.Parameters.AddWithValue("@Nm_Fornecedor", "Carne");
    
                    sql.ExecuteNonQuery();               
                }
                catch (OleDbException ex)
                {
                    throw new ApplicationException(ex.ToString());
                }
                finally
                {
                    conexao.Close();
                }
            }
    


    A linha : "conexao = new OleDbConnection(conexao_acces);" deve ficar fora do bloco try finally e o método close já que é chamado no finally não há necessidade de chamá-lo novamente.

    Da maneira como está programado o método close é chamado duas vezes. Isto pode causar uma exceção que não é captada, visto que, a segunda vez que é chamado o método close a conexão já está fechada.

    Atente-se também a string de conexão. O site abaixo mostra exemplos de string de conexão no Access:

    http://www.sqlstrings.com/MS-Access-connection-strings.htm

    Espero ter ajudado

    Abraço

     

     

     

     

     


    Rafael de Camillis Tairum
    MCPD Enterprise Application Developer 3.5 , Comptia+ TTT
    Blog: http://dicamillis.wordpress.com
    quarta-feira, 26 de outubro de 2011 01:38
  • Olá Rafael!

    Fiz como como dito, mas continua não gravando no banco

     public void gravaFornecedor(ControleMODEL fornecedor)
            {
                
                OleDbConnection conexao = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\WRControle\bin\Debug\controle.mdb");
                try
                {
                   
                    conexao.Open();
                    OleDbCommand sql = new OleDbCommand(@"INSERT INTO fornecedores VALUES (@CodFornecedor,@Nome_Fornecedor)", conexao);
                
                    sql.Parameters.AddWithValue("@CodFornecedor",fornecedor.CodigoF);
                    sql.Parameters.AddWithValue("@Nome_Fornecedor", fornecedor.FornecedorF);
                    
                    sql.ExecuteNonQuery();
                }
                catch (OleDbException ex)
                {
                    throw new ApplicationException(ex.ToString());
                }
                finally
                {
                    conexao.Close();
                }
    
            }
    


    quarta-feira, 26 de outubro de 2011 19:43
  • Prezado,

    O OleDbCommand nao trabalha com parâmetros nomeados... Você precisa substituir na sua query os nomes dos parâmetros por pontos de interrogacao...

    http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbparameter.aspx

     

    The OLE DB.NET Framework Data Provider uses positional parameters that are marked with a question mark (?) instead of named parameters.

    When querying an Oracle database using the Microsoft OLE DB Provider for Oracle (MSDAORA) and the OLE DB.NET Framework Data Provider, using the LIKE clause to query values in fixed-length fields may not return all expected matches. The reason is that when Oracle matches values for fixed-length fields in a LIKE clause, it matches the entire length of the string, including any padding trailing spaces. For example, if a table in an Oracle database contains a field named "Field1" that is defined as char(3), and you enter the value "a" into a row of that table, the following code does not return the row.

    string queryString = "SELECT * FROM Table1 WHERE Field1 LIKE ?";
    OleDbCommand command = new OleDbCommand(queryString, connection);
    command.Parameters.Add("@p1", OleDbType.Char, 3).Value = "a";
    OleDbDataReader reader = command.ExecuteReader();


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    quinta-feira, 27 de outubro de 2011 09:31
    Moderador
  • bOM DIA

    sou leigo na área vc poderia me passar as modificações no meu código

    porque eu não entendi, o exemplo que vc me passou é com o comando SELECT e quero para o comando INSERT

    public void gravaFornecedor(ControleMODEL fornecedor)
            {
                
               
                try
                {
                    OleDbConnection conexao = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\WRControle\bin\Debug\controle.mdb");
                    conexao.Open();
                    OleDbCommand sql = new OleDbCommand(@"INSERT INTO fornecedores VALUES (@CodFornecedor,@Nome_Fornecedor)", conexao);
                
                    
                    sql.Parameters.AddWithValue("@CodFornecedor",fornecedor.CodigoF);
                    sql.Parameters.AddWithValue("@Nome_Fornecedor", fornecedor.FornecedorF);
                    sql.ExecuteNonQuery();
                    conexao.Close();
                }
                catch (OleDbException ex)
                {
                    throw new ApplicationException(ex.ToString());
                }
            
    
            }
    


    quinta-feira, 27 de outubro de 2011 11:53
  • Olá,

    Tente desta forma:

                try
                {
                    OleDbConnection conexao = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\WRControle\bin\Debug\controle.mdb");
                    conexao.Open();
                    OleDbCommand sql = new OleDbCommand(@"INSERT INTO fornecedores VALUES (?, ?)", conexao);
                
                    
                    sql.Parameters.AddWithValue("@CodFornecedor",fornecedor.CodigoF);
                    sql.Parameters.AddWithValue("@Nome_Fornecedor", fornecedor.FornecedorF);
                    sql.ExecuteNonQuery();
                    conexao.Close();
                }
                catch (OleDbException ex)
                {
                    throw new ApplicationException(ex.ToString());
                }
    



    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    quinta-feira, 27 de outubro de 2011 11:56
    Moderador
  • Agora Consegui o código é esse

     private void btnNovo_Click(object sender, EventArgs e)
            {
                try
                {
                    precosMODEL obj_controle = new precosMODEL();
    
                    obj_controle.IDControle = Convert.ToInt32(tb_codigo.Text);
                    obj_controle.Fornecedor = tb_Descricao.Text;
                    obj_controle.Valor = Convert.ToDouble(tb_Preco.Text);
                    obj_controle.DataVenc = Convert.ToDateTime(tbmsDataTransf.Text);
             
                    precosBLL controlebll = new precosBLL();
                    controlebll.gravaPrecosDal(obj_controle);
                    MessageBox.Show("REGISTRO gravado com sucesso! ","ATENÇÃO!!!",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
                    povoa_grade();
    
                    tbPesquisa.Text = "";
                    tb_codigo.Text = "";
                    tb_Descricao.Text = "";
                    tb_Preco.Text = "";
                    tbmsDataTransf.Text = "";
    
                }
                catch (Exception erro)
                {
                    MessageBox.Show("Erro ao gravar O REGISTRO!!! " + erro);
                }
            }
    


    quinta-feira, 27 de outubro de 2011 20:56