none
Salvar dados em duas tabelas em Access RRS feed

  • Pergunta

  • Boas, tenho uma base de dados em Access a qual contém várias tabelas, entre elas 2 que estou a ter problemas.

    1ª Sales

    2ª ProductSold

    Acontece que ao clicar no botão guardar, ele grava os dados na tabela Sales e a seguir dá um erro:

    Data type mismatch in criteria expression.

    Já verifiquei o tipo de dado de cada elemento na base de dados e está tudo certo.

    Na segunda tabela ele grava alguns dados, mas não todos porque dá a excepção...

    Aqui vai o meu código...

     if (txtCustomerID.Text == "")
                    {
                        MessageBox.Show("Introduza um cliente", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        txtCustomerID.Focus();
                        return;
                    }
    
                    if (ListView1.Items.Count == 0)
                    {
                        MessageBox.Show("Não tem produtos inseridos", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
    
                    con = new OleDbConnection(cs);
                    con.Open();
                    string ct = "select Doc, DocNo from Sales where Doc=@find AND DocNO=find1";
                    cmd = new OleDbCommand(ct);
                    cmd.Connection = con;
                    cmd.Parameters.Add(new OleDbParameter("@find", System.Data.OleDb.OleDbType.VarChar, 20, "Doc"));
                    cmd.Parameters.Add(new OleDbParameter("@find1", System.Data.OleDb.OleDbType.Integer, 20, "DocNo"));
                    cmd.Parameters["@find"].Value = cb_doctype.Text;
                    cmd.Parameters["@find1"].Value = Convert.ToInt32(txt_ndoc.Text);
    
                rdr = cmd.ExecuteReader();
                    if (rdr.Read() == true)
                    {
                        MessageBox.Show("Este número de documento já existe", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                       
                        if ((rdr != null))
                        {
                            rdr.Close();
                        }
                        return;
                    }
    
                    con = new OleDbConnection(cs);
                    con.Open();
    
                    string cb = "insert Into Sales(InvoiceNo,InvoiceDate, CustomerID,SubTotal,GrandTotal,Remarks, Doc, DocNo) VALUES (@invoiceNo, @date, @customerid, @subtotal, @grandtotal, @remarks, @doc, @docNo)";
                    cmd = new OleDbCommand(cb);
                    cmd.Connection = con;
                    cmd.Parameters.AddWithValue("@invoiceNo", txt_ndoc.Text + cb_doctype.Text);
                    cmd.Parameters.AddWithValue("@date", Convert.ToDateTime(dtpInvoiceDate.Text));
                    cmd.Parameters.AddWithValue("@customerid", txtCustomerID.Text);
                    cmd.Parameters.AddWithValue("@subtotal",Convert.ToInt32(txtSubTotal.Text));
                    cmd.Parameters.AddWithValue("@grandtotal", Convert.ToInt32(txtTotal.Text));
                    cmd.Parameters.AddWithValue("@remarks", txtRemarks.Text);
                    cmd.Parameters.AddWithValue("@doc", cb_doctype.Text);
                    cmd.Parameters.AddWithValue("@docNo", Convert.ToInt32(txt_ndoc.Text));
    
    
                cmd.ExecuteReader();
                    if (con.State == ConnectionState.Open)
                    {
                        con.Close();
                    }
                    con.Close();
    
    
                    for (int i = 0; i <= ListView1.Items.Count - 1; i++)
                    {
                        con = new OleDbConnection(cs);
    
                        string cd = "insert Into ProductSold(ConfigID,Quantity,Price,TotalAmount, Doc, DocNo) VALUES (@ConfigID,@Quantity,@Price,@Totalamount, @Doc, @DocNo)";
                    cmd = new OleDbCommand(cd);
                        cmd.Connection = con;
                        cmd.Parameters.AddWithValue("@Doc", cb_doctype.Text);
                        cmd.Parameters.AddWithValue("@DocNo", Convert.ToInt32(txt_ndoc.Text));
                        cmd.Parameters.AddWithValue("ConfigID", Convert.ToInt32(ListView1.Items[i].SubItems[3].Text));
                        cmd.Parameters.AddWithValue("Quantity", Convert.ToInt32(ListView1.Items[i].SubItems[3].Text));
                        cmd.Parameters.AddWithValue("Price", Convert.ToInt32(ListView1.Items[i].SubItems[3].Text));
                        cmd.Parameters.AddWithValue("TotalAmount", Convert.ToInt32(ListView1.Items[i].SubItems[3].Text));
                        con.Open();
                        cmd.ExecuteNonQuery();
                        con.Close();
                    }
    O erro aparece no cmd.ExecuteNonQuery();

    Agradeço toda a ajuda que me possam dar...

    Cumprimentos

    sábado, 28 de janeiro de 2017 21:09

Respostas

  • Boas, assunto resolvido.

    Realmente estava tudo correto, o problema estava no VS que não estava a atualizar o ficheiro .csproj e portanto não tinha ainda o código atualizado.

    Cumprimentos e obrigado pela ajuda.

    segunda-feira, 30 de janeiro de 2017 11:00

Todas as Respostas

  • Olá, 

    Acredito que o problema seja você não estar usando o @ nos seguintes campos: ConfigID, Quantity, Price e TotalAmount. 
    Pois você esta montando a clausula de insert com o @ antes deles. 


    Espero ter ajudado.
    sábado, 28 de janeiro de 2017 21:21
  • Obrigado pelo reparo... já corrigi e continua a dar o mesmo problema.

    sábado, 28 de janeiro de 2017 21:26
  • Entendi, 

    Confirma o tipo de dado do "Price" como Inteiro na base ? 

    sábado, 28 de janeiro de 2017 21:46
  • Sim está como "Número".

    Já fiz mais um teste... retirei o seguinte código:

     for (int i = 0; i <= ListView1.Items.Count - 1; i++)
                {
                    con = new OleDbConnection(cs);
    
                    string cd = "insert Into ProductSold(ConfigID,Quantity,Price,TotalAmount, Doc, DocNo) VALUES (@ConfigID, @Quantity, @Price, @Totalamount, @Doc, @DocNo)";
    
                    cmd = new OleDbCommand(cd);
                    cmd.Connection = con;
                    cmd.Parameters.AddWithValue("@Doc", cb_doctype.Text);
                    cmd.Parameters.AddWithValue("@DocNo", Convert.ToInt32(txt_ndoc.Text));
                    cmd.Parameters.AddWithValue("@ConfigID", ListView1.Items[i].SubItems[0].Text);
                    cmd.Parameters.AddWithValue("@Quantity", Convert.ToInt32(ListView1.Items[i].SubItems[3].Text));
                    cmd.Parameters.AddWithValue("@Price", ListView1.Items[i].SubItems[2].Text);
                    cmd.Parameters.AddWithValue("@TotalAmount", Convert.ToInt32(ListView1.Items[i].SubItems[4].Text));
                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();
                }
    E o resto funcionou bem... portanto o erro deve estar aqui

    sábado, 28 de janeiro de 2017 21:56
  • Certo, 

    Esse erro ocorre quando algum dos parâmetros que você está passando está indo com o tipo diferente do que está sendo esperado na sua base de dados. 

    Verifique se algum dos parâmetros está indo diferente do tipo que esta na tabela. 
    Olhando o trecho de código eu não consigo saber os dados que estão na sua tabela. 
    Mas pude perceber que nessa ultima atualização você parou de converter alguns valores. 

    Se puder postar o tipo dos campos na sua tabela, acho que ajudaria a gente tentar descobrir o que esta acontecendo. 

    sábado, 28 de janeiro de 2017 22:08
  • Então tenho:

    InvoiceNo - Texto Breve

    ConfigID - Numero

    Quantity - Numero

    Price - Numero

    TotalAmount - Numero

    Doc - Texto Longo

    DocNo - Numero

    Tenho outros campos na tabela, mas não são usados neste caso...


    Realmente tirei algumas conversões porque, apesar de ser do tipo INT, o Visual Studio indicou que ConfigID e Price com essa conversão ficava errado... assim da maneira que coloquei deixou de dar erro em ambos.
    • Editado D3POD sábado, 28 de janeiro de 2017 22:52 Faltou alguns detalhes
    sábado, 28 de janeiro de 2017 22:46
  • Entendi, cara realmente não sei mais o que te dizer. 

    Experimente mudar o seu insert, e ir fazendo testes. 
    Por exemplo primeiro apenas com o campo @Doc, depois acrescente o campo @DocNo e vai acrescentando os outros parametros.
    A hora que der erro descobrimos qual é o campo que está dando erro. 

    sábado, 28 de janeiro de 2017 23:00
  • Já tentei também... o estranho é que se for campo a campo ele dá sempre erro...
    sábado, 28 de janeiro de 2017 23:30
  • Boas, assunto resolvido.

    Realmente estava tudo correto, o problema estava no VS que não estava a atualizar o ficheiro .csproj e portanto não tinha ainda o código atualizado.

    Cumprimentos e obrigado pela ajuda.

    segunda-feira, 30 de janeiro de 2017 11:00
  • Legal, 

    Valeu por postar a solução aqui.


    Precisando estamos ai. 
    Abraço 
    segunda-feira, 30 de janeiro de 2017 11:09