Usuário com melhor resposta
Salvar dados em duas tabelas em Access

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
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.
- Marcado como Resposta Robson William SilvaModerator segunda-feira, 30 de janeiro de 2017 11:50
Todas as Respostas
-
-
-
-
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
-
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.
- Sugerido como Resposta Juliano CustódioMVP terça-feira, 31 de janeiro de 2017 11:43
-
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
-
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.- Sugerido como Resposta Juliano CustódioMVP segunda-feira, 30 de janeiro de 2017 11:08
- Não Sugerido como Resposta Juliano CustódioMVP terça-feira, 31 de janeiro de 2017 11:42
-
-
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.
- Marcado como Resposta Robson William SilvaModerator segunda-feira, 30 de janeiro de 2017 11:50
-