Jump to content

Insert com Visual Basic 2010 e Access


Guerra7

Recommended Posts

Boas, não sei se abri o tópico no lugar correcto...

Eu estou a fazer um projecto para apresentar agora no final do ano do meu curso e como estou numa loja de informática a estagiar e não tinha ideias para a pap então comecei a fazer um programa do género que eles lá têm...

Quando vou para inserir um novo cliente à base dados ( feita em Access ) tenho vários campos para preencher mas por vezes não é preciso preencher todos, basta o Nome e o Numero de telemóvel do cliente ... Estou a fazer a contagem dos clientes Automaticamente fazendo o Max da coluna Numero ( que é do tipo Codcliente ) e depois adiciono mais 1 ao numero que lá está...até ai tudo bem..

Quando eu preencho só o Nome e o Telemóvel e carrego em Guardar , da-me um erro " Tipo de dados incorrecto na expressão de critérios " não percebo porque... porque à uns tempos fiz uma Agenda mesmo para mim ... e tenho Nome , Email , Telemóvel , se eu preencher só o Nome e o Telemóvel insere na base dados e não dá erro nenhum...e a coluna Email fica em branco.

Era isso que eu queria fazer para este programa que estou a fazer agora ...

Deixo aqui o código que tenho para o INSERT :

'Declaração de Variaveis para cada uma das caixas de texto.

Dim numero, nome, numerocontribuinte, morada, codigopostal, pais, zona, telefone, telemovel, email, fax As String

'Guardar nas variaveis o que é digitado nas caixas de texto.

numero = txtnumerocliente.Text

nome = txtnome.Text

numerocontribuinte = txtnumerocontribuinte.Text

morada = txtmorada.Text

codigopostal = txtcodigopostal.Text

pais = cbpaises.SelectedValue.ToString

zona = txtzona.Text

telefone = txttelefone.Text

telemovel = txttelemovel.Text

email = txtemail.Text

fax = txtfax.Text

'Inserir os dados na tabela Clientes da Base Dados.

Try

cmd.CommandText = "INSERT INTO Clientes(Numero, Nome, Ncontribuinte, Morada, Codigopostal, Pais, Zona, Telefone, Telemovel, Email, Fax) values('" + numero + "','" + nome + "','" + numerocontribuinte + "','" + morada + "','" + codigopostal + "','" + pais + "','" + zona + "','" + telefone + "','" + telemovel + "','" + email + "','" + fax + "');"

cmd.ExecuteNonQuery()

MessageBox.Show("O registo foi inserido na Base Dados :" & vbNewLine & "Nome : " & txtnome.Text & vbNewLine & "Telemóvel : " & txttelemovel.Text & "", "Facturação Xiracomp - Registo do Cliente", MessageBoxButtons.OK, MessageBoxIcon.Information)

txtnome.ResetText()

txtnumerocontribuinte.ResetText()

txtmorada.ResetText()

txtcodigopostal.ResetText()

cbpaises.SelectedValue = "Portugal"

txtzona.ResetText()

txttelefone.ResetText()

txttelemovel.ResetText()

txtemail.ResetText()

txtfax.ResetText()

'Verifica o Número máximo na Coluna Numero da Tabela Clientes e adiciona mais um número.

'A caixa de texto fica enable, para nao poder alterar o numero.

Dim Da1 As New OleDb.OleDbDataAdapter("Select MAX(Numero) From Clientes", sqlConexao)

Dim ds1 As New DataTable

Da1.Fill(ds1)

txtnumerocliente.Text = ds1.Rows(0)(0).ToString + 1

txtnumerocliente.Enabled = False

Catch ex As Exception

MessageBox.Show(ex.Message, "Facturação Xiracomp - Registo do Cliente", MessageBoxButtons.OK, MessageBoxIcon.Information)

End Try

Deixo aqui também a tabela Clientes:

http://imageshack.us/photo/my-images/99/basedadostabelaclientes.png/

Espero que me possam ajudar sff . . .

Link to comment
Share on other sites

boas

amigo Guerra7, não tenho como testar o seu cod neste pc.

1 - referente ao numero (CodCliente) você pode fazer conforme está a fazer mas eu recomendava o Numero com «numeração automatica» evitava de pesquisar o ultimo registo.

no caso de optar conforme está fazendo terá que colocar o cod de busca do numero antes de carregar a variavel numero.

2 - no insert into o + junto ás variaveis deve substituir por & , penso que o + não é recomendado.

3 - não vi a ligação à base de dados.

deixo-lhe aqui um cod, altere as sua necessidades.

Public Sub GravarDados()

    Dim conexao As New OleDb.OleDbConnection
    Dim sqlCadTelGravar As String
    Dim Cm As New OleDb.OleDbCommand
    Try
	    conexao.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\BaseDados\GestaoChamadasTelefonicas.accdb;Jet OLEDB:Database Password= " & vCodDB & ";")
	    conexao.Open()
	    sqlCadTelGravar = "INSERT INTO ListaTelefonica(NumTelfone,IDColaborador) VALUES ( " & txtNumTelefone.Text & ", " & vCadTelIdColaborador & ")"
	    Cm.CommandText = sqlCadTelGravar
	    Cm.Connection = conexao
	    Dim vCadTelgravar As Integer = Cm.ExecuteNonQuery()
	    If vCadTelgravar < 1 Then
		    MsgBox("O registo não foi efectuado")
	    Else
		    MsgBox("Registo efectuado com sucesso")
	    End If
    Catch ex As Exception
	    MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
    conexao.Close()
    Cm.Connection = Nothing
    conexao = Nothing

deixo-lhe aqui outro toturial, opte pelo que mais lhe convier:

https://wiki.portugal-a-programar.pt/dev_net/vb.net/access/

cumps

acao

Link to comment
Share on other sites

Obrigado por ter respondido, eu tive a ver e já troquei e meti como me disse...o numero é que deixei como tinha , ao adicionar mais um depois de fazer o select Max(Numero)....

Vou por aqui a imagem de como eu queria fazer e ainda me dá o erro :

http://imageshack.us/photo/my-images/444/erroaoadicionarcliente.png/

E deixo aqui também o código já alterado...

O Botão Guardar :

Private Sub tsbguardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbguardar.Click

'Declaração de Variaveis para cada uma das caixas de texto.

Dim numero, nome, numerocontribuinte, morada, codigopostal, pais, zona, telefone, telemovel, email, fax As String

'Guardar nas variaveis o que é digitado nas caixas de texto.

numero = txtnumerocliente.Text

nome = txtnome.Text

numerocontribuinte = txtnumerocontribuinte.Text

morada = txtmorada.Text

codigopostal = txtcodigopostal.Text

pais = cbpaises.SelectedValue.ToString

zona = txtzona.Text

telefone = txttelefone.Text

telemovel = txttelemovel.Text

email = txtemail.Text

fax = txtfax.Text

'Inserir os dados na tabela Clientes da Base Dados.

Try

sqlgravar = "INSERT INTO Clientes (Numero, Nome, Ncontribuinte, Morada, Codigopostal, Pais, Zona, Telefone, Telemovel, Email, Fax) values('" & numero & "','" & nome & "','" & numerocontribuinte & "','" & morada & "','" & codigopostal & "','" & pais & "','" & zona & "','" & telefone & "','" & telemovel & "','" & email & "','" & fax & "');"

cm.CommandText = sqlgravar

cm.Connection = conexao

Dim registo As String = cm.ExecuteNonQuery()

If registo < 1 Then

MsgBox("O registo não foi efectuado")

Else

MessageBox.Show("O registo foi inserido com sucesso :" & vbNewLine & "Nome : " & txtnome.Text & vbNewLine & "Telemóvel : " & txttelemovel.Text & "", "Programa de Gestão Xiracomp - Registo do Cliente", MessageBoxButtons.OK, MessageBoxIcon.Information)

End If

txtnome.ResetText()

txtnumerocontribuinte.ResetText()

txtmorada.ResetText()

txtcodigopostal.ResetText()

cbpaises.SelectedValue = "Portugal"

txtzona.ResetText()

txttelefone.ResetText()

txttelemovel.ResetText()

txtemail.ResetText()

txtfax.ResetText()

'Verifica o Número máximo na Coluna Numero da Tabela Clientes e adiciona mais um número.

'A caixa de texto fica enable, para nao poder alterar o numero.

Dim Da1 As New OleDb.OleDbDataAdapter("Select MAX(Numero) From Clientes", conexao)

Dim ds1 As New DataTable

Da1.Fill(ds1)

txtnumerocliente.Text = ds1.Rows(0)(0).ToString + 1

txtnumerocliente.Enabled = False

Catch ex As Exception

MessageBox.Show(ex.Message, "Programa de Gestão Xiracomp - Registo do Cliente", MessageBoxButtons.OK, MessageBoxIcon.Information)

End Try

conexao.Close()

cm.Connection = Nothing

conexao = Nothing

End Sub


E agora está aqui a ligação à base dados : ( Como tenho no inicio )

Imports System.Data.Odbc

Public Class registarclientes

Dim conexao As New OleDb.OleDbConnection

Dim sqlgravar As String

Dim cm As New OleDb.OleDbCommand

e no form_load tenho :

conexao.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Bruno Guerra\Visual Basic\Projectos\PAP - Bruno Guerra\Xiracomp.accdb;")

conexao.Open()
Link to comment
Share on other sites

isto deveria estar antes das variaveis e depois da abertura da db.

'Verifica o Número máximo na Coluna Numero da Tabela Clientes e adiciona mais um número.

'A caixa de texto fica enable, para nao poder alterar o numero.

Dim Da1 As New OleDb.OleDbDataAdapter("Select MAX(Numero) From Clientes", conexao)

Dim ds1 As New DataTable

Da1.Fill(ds1)

txtnumerocliente.Text = ds1.Rows(0)(0).ToString + 1

txtnumerocliente.Enabled = False

aqui « Imports System.Data.Odbc» ou esta mal escrito ou está errado deveria ser Oledb

E agora está aqui a ligação à base dados : ( Como tenho no inicio )

Imports System.Data.Odbc

Public Class registarclientes

Dim conexao As New OleDb.OleDbConnection

Dim sqlgravar As String

Dim cm As New OleDb.OleDbCommand

isto não pode estar aqui, porque estamos a fechar a conexao no final do cod, ou coloca este cod dentro do evento clik do botao ou terá que eliminar cod fechar a ligação.

e no form_load tenho :

conexao.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Bruno Guerra\Visual Basic\Projectos\PAP - Bruno Guerra\Xiracomp.accdb;")

conexao.Open()

é o que estou a ver, existe também a declaração da variavel numero, telefone, fax que deveria ser long, mas penso que não interfere no erro.

para testar poderá colocar breakpoints e ir correndo o cod e verificar mesmo em que local dá o erro.

edit: acrescentar info:

na query (insert Into) pode usar directamente os campos «txtnumerocliente.Text» poupa codigo.

cumps

acao

Edited by acao
Link to comment
Share on other sites

isto deveria estar antes das variaveis e depois da abertura da db.

aqui « Imports System.Data.Odbc» ou esta mal escrito ou está errado deveria ser Oledb

isto não pode estar aqui, porque estamos a fechar a conexao no final do cod, ou coloca este cod dentro do evento clik do botao ou terá que eliminar cod fechar a ligação.

é o que estou a ver, existe também a declaração da variavel numero, telefone, fax que deveria ser long, mas penso que não interfere no erro.

para testar poderá colocar breakpoints e ir correndo o cod e verificar mesmo em que local dá o erro.

edit: acrescentar info:

na query (insert Into) pode usar directamente os campos «txtnumerocliente.Text» poupa codigo.

cumps

acao

Já fiz as alterações...e continua a dar o erro do " Tipo de dados incorrecto na expressão de critérios " .

Mas o que não percebo é que se eu preencher só o campo do Nome e o Telemóvel dá o erro ... mas se eu preencher os no mínimo o Nome , Numero Contribuinte , Telefone, Telemóvel e Fax já insere na base dados ... e se preencher todos os campos insere também...

Não percebo mesmo porque que só preenchendo aqueles dois campos ( Nome e Telemóvel ) dá erro ...

Link to comment
Share on other sites

Já fiz as alterações...e continua a dar o erro do " Tipo de dados incorrecto na expressão de critérios " .

Mas o que não percebo é que se eu preencher só o campo do Nome e o Telemóvel dá o erro ... mas se eu preencher os no mínimo o Nome , Numero Contribuinte , Telefone, Telemóvel e Fax já insere na base dados ... e se preencher todos os campos insere também...

Não percebo mesmo porque que só preenchendo aqueles dois campos ( Nome e Telemóvel ) dá erro ...

Outra duvida que tenho é no insert quando faço pela textbox como é que devo por

sqlgravar = ("INSERT INTO Clientes (Numero, Nome, Ncontribuinte, Morada, Codigopostal, Pais, Zona, Telefone, Telemovel, Email, Fax) values('" & txtnumerocliente.Text & "','" & txtnome.Text & "','" & txtnumerocontribuinte.Text & "','" & txtmorada.Text & "','" & txtcodigopostal.Text & "','" & cbpaises.SelectedValue & "','" & txtzona.Text & "','" & txttelefone.Text & "','" & txttelemovel.Text & "','" & txtemail.Text & "','" & txtfax.Text & "');")

Em relação como estão separadas , com as aspas e as películas ..

Link to comment
Share on other sites

Recomendo que leias estes dois artigos, usando:

VB.NET: Gestão de Dados em SQL Server - Parte I

VB.NET: Gestão de Dados em SQL Server - Parte II

São para SQL mas como referido no artigo:

No caso da utilização de bases de dados em Microsoft Access (*.mdb) é necessário apenas alterar as classes sendo a estrutura igual (ex. SQL = SqlConnection; Access = OleDbConnection). Também é necessário alterar o namespace que se importa, não sendo o System.Data.SqlClient mas sim o System.Data.OleDb.
Link to comment
Share on other sites

boas isso deve ser por causa dos valores nulos,

para cada valor que poderá ser nulo e na db o campo seja númerico coloca assim na query:

" & IIf(txtMatricula.Text = "", "Null", txtMatricula.Text).ToString

ou se pretender alterar conforme indiquei no 1 post e agora o amigo Jpaulino, seria assim:

command.Parameters.Add("@nome", OleDbType.VarChar).Value = IIf(TextBox1.Text.Equals(String.Empty), DBNull.Value, TextBox1.Text)

Em relação como estão separadas , com as aspas e as películas ..

se o valor for numerico é apenas aspas e se for string ou data é pila e aspas.

Ps: amigo Jpaulino poderia ver o link colocado no meu 1º post que não está a funcionar, penso que seja um tutorial do nosso amigo bioshock ou seu.

optar por uma maneira ou outra não lhe sei dizer a mais vantajosa ou mais rápida, porque conforme está a fazer utiliza menos cod, provavelmente deve-se utilizar a outra opção, mas o amigo Jpaulino já que intreviu e se quiser dar uma dicas, mesmo para me elucidar. também agradeço.

Edit: acrescentar inf.

Amigo Jpaulino referente ao toturial já vi que o erro é de acesso ao espaço Wiki «erro «Warning: include()» » e não de acesso ao tutorial , obrigado.

cumps

acao

Edited by acao
Link to comment
Share on other sites

Edit: acrescentar inf.

Amigo Jpaulino referente ao toturial já vi que o erro é de acesso ao espaço Wiki «erro «Warning: include()» » e não de acesso ao tutorial , obrigado.

Já estamos a ver o que se passa com a wiki. 😉

optar por uma maneira ou outra não lhe sei dizer a mais vantajosa ou mais rápida, porque conforme está a fazer utiliza menos cod, provavelmente deve-se utilizar a outra opção, mas o amigo Jpaulino já que intreviu e se quiser dar uma dicas, mesmo para me elucidar. também agradeço.

A utilização dos parameters é sempre recomendado pois embora existam mais 3/4 linhas de código, resolvem inúmero problemas como SQL Injection, Internacionalização (números, datas, formatações), caracteres (O'Conner por exemplo), etc.

Melhor mesmo só utilizando um ORM (Entity Framework, NHybernate, etc)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.