INSERT CADCLIENTE, CADPRODUTOS, CADFORNECEDOR

GLEDSON26 28/07/2015 21:33:01
#449340
Galera é o seguinte, estou com problema. meus formes só grava no banco de dados Acces se eu preencher todos os campos do Form. se eu nao preencher todos, da erro e nao grava. meu codigo ta assim.

Private Sub PGravaCliente()
Using con As OleDbConnection = GetConnection()
Try
con.Open()
Dim sql As String = [Ô]INSERT INTO cadCliente (data,nome,tipo,lagradouro,numero,complemento,bairro,cidade,uf,email,cpf,cnpj,telefone,observacoes) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)[Ô]
Dim cmd As OleDbCommand = New OleDbCommand(sql, con)

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@data[Ô], mkbData.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@nome[Ô], txtNome.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@tipo[Ô], txtTipo.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@lagradouro[Ô], txtLagradouro.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@numero[Ô], txtNumero.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@complemento[Ô], txtComplemento.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@bairro[Ô], txtBairro.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@cidade[Ô], txtCidade.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@uf[Ô], cmbUF.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@email[Ô], txtEmail.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@cpf[Ô], mkbCpf.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@cnpj[Ô], mkbCnpj.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@telefone[Ô], mkbTelefone.Text))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@observacoes[Ô], txtObservacoes.Text))


cmd.ExecuteNonQuery()

MsgBox([Ô]Cliente gravado com sucesso.[Ô], MsgBoxStyle.Information)

[ô]Aqui limpa os campos do formulario
mkbData.Text = [Ô][Ô]
txtNome.Text = [Ô][Ô]
txtTipo.Text = [Ô][Ô]
txtLagradouro.Text = [Ô][Ô]
txtNumero.Text = [Ô][Ô]
txtComplemento.Text = [Ô][Ô]
txtBairro.Text = [Ô][Ô]
txtCidade.Text = [Ô][Ô]
cmbUF.Text = [Ô][Ô]
txtEmail.Text = [Ô][Ô]
mkbCpf.Text = [Ô][Ô]
mkbCnpj.Text = [Ô][Ô]
mkbTelefone.Text = [Ô][Ô]
txtObservacoes.Text = [Ô][Ô]

Catch ex As Exception
MsgBox(ex.Message)
Finally
con.Close()
End Try
End Using
End Sub
KERPLUNK 28/07/2015 22:14:44
#449341
Resposta escolhida
Você tem duas opções:
1 - Usar operadores ternários para converter para [Ô]null[Ô] os valores em branco e em seguida para DBNull
2 - Usar OOP e criar a classe que já trataria tanto a função de inserção quanto a de tratamento de dados em branco ou null

Você escolhe o que quer fazer. Lembrando, não existe [Ô]a mais simples[Ô] ou [Ô]a mais rápida[Ô], existem as opções mais corretas e mais funcionais e as gambiarras. De acordo com o que você escolher, podemos passar uma solução para seu caso.
KERPLUNK 28/07/2015 23:35:48
#449342
Por favor, perguntas somente no fórum, ok? A solução mais adequada seria criar uma classe e fazer tudo nela. Mas vejo que você é iniciante ainda então o approach de ternários é mais simples de entender:

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@nome[Ô], iif(txtNome.Text = string.Empty, DBNull.Value, txtNome.Text))


Faça o mesmo para os outros parâmetros.
KERPLUNK 28/07/2015 23:44:38
#449343
Outra coisa importante, qual o banco de dados que está usando?
GLEDSON26 29/07/2015 07:48:09
#449348
vlw KERPLUNK, entao vou ter q jogar esse paramentro em todos os campos ne isso?
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@nome[Ô], iif(txtNome.Text = string.Empty, DBNull.Value, txtNome.Text))


vou ter q acrescentar em cada paramentro cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@data[Ô], mkbData.Text))

e o INSERT esta COrreto?

Dim sql As String = [Ô]INSERT INTO cadCliente (data,nome,tipo,lagradouro,numero,complemento,bairro,cidade,uf,email,cpf,cnpj,telefone,observacoes) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)[Ô]
Dim cmd As OleDbCommand = New OleDbCommand(sql, con)
GLEDSON26 29/07/2015 10:32:38
#449356
Estou usando o banco de dados Access.
todos os campos estao como texto curto.
e no form. tudo textobox.
KERPLUNK 29/07/2015 19:32:28
#449371
Exato, você vai adicionar um código equivalente em cada um dos parâmetros. Obviamente modificando o nome dos campos, e controles dos quais os valores vêm. Cogite a possibilidade de utilizar um SGDB melhor. Access, é bom para aplicações bem pequenas, mas quando o porte muda nem que seja um pouquinho, então ele passa a não atender mais tão bem assim. Outra coisa importante é usar tipagem de dados corretamente. Campos texto, Data e números tem propriedades diferentes, tanto de organização(ORDER BY), quando para cálculos. [Ô]1[Ô] + [Ô]1[Ô] não é [Ô]2[Ô], mas 1 + 1 é. Para entender, números são possíveis de serem usados como parâmetro de calculo, já campos texto não. Na ordenação o mesmo. A ordem muda e muito quando se tem um campo texto que deveria ser número. Veja os dados:
1 - Joao
2 - Maria
11 - Pedro
13 - José
20 - Antonio

Eles estão em ordem de ID, mas se for um campo texto e for ordenado, você vai ter:
1 - Joao
11 - Pedro
13 - José
2 - Maria
20 - Antonio
A ordem mudou e muito...
Tópico encerrado , respostas não são mais permitidas