Jump to content

[ RESOLVIDO ] 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 . . .

Edited by Guerra7
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:

http://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()

Edited by Guerra7
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

  • 1 year later...

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:

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

cumps

acao

Boa Tarde,

Eu estou tentando inserir dados no meu banco de dados no Access pelo Vb, mas dá erro de sintaxe na introdução insert into logo abaixo esta o código

Dim cx As New OleDb.OleDbConnection

Dim sqlCadTelGravar As String

Dim cmd As New OleDb.OleDbCommand

Try

cx.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Academia.accdb;User ID=admin;")

cx.Open()

sqlCadTelGravar = "Insert INTO Aluno ( Aluno,DataNasci,Endereço,Número,Telefone,Celular,E-mail,Aula,Valor,Pago ) VALUES ( " & AlunoTextBox.Text & ", " & MaskedTextBox1.Text & "," & EndereçoTextBox.Text & "," & NúmeroTextBox.Text & "," & MaskedTextBox2.Text & "," & MaskedTextBox3.Text & "," & E_mailTextBox.Text & "," & cbx_Aula.Text & "," & ValorTextBox.Text & "," & PagoCheckBox.Text & ")"

cmd.CommandText = sqlCadTelGravar

cmd.Connection = cx

Dim vCadTelgravar As Integer = cmd.ExecuteNonQuery()

If vCadTelgravar < 1 Then

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

Else

MsgBox("Registo efetuado com sucesso")

End If

Catch ex As Exception

MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

End Try

cx.Close()

cmd.Connection = Nothing

cx = Nothing

End Sub

Por favor se puder me auxiliar, eu agradeço

Link to comment
Share on other sites

Boas sou novato

Eu copiei o código:

[/size]
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

Porém o código não consegue ler letras alguem poderia me fazer um codigo que aceite letras?

Agradeço desde já.

Ajude-me?

Link to comment
Share on other sites

Este é o meu código:

[  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=C:\Users\root\Documents\usuariosbd1.accdb;Jet OLEDB:Database Password=  Nome =,  ").ToString
           conexao.Open()
           sqlCadTelGravar = "INSERT INTO tbldata(Nome,Senha) values ( " & NomeTextBox.Text & ", " & SenhaTextBox.Text & ")".ToString
           Cm.CommandText = sqlCadTelGravar
           Cm.Connection = conexao
           Dim vCadTelgravar As String = Cm.ExecuteNonQuery.ToString
           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

Se eu escrever alguma letra e clicar no botao dá um erro :Erro de sintaxe(operador faltando) na expressão de consulta "teste"

Ajude-me?

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.