• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

passado

Ajuda na resolução de alguns erros em vb.net com BD access

28 mensagens neste tópico

Boas pessoal, estou a fazer um projecto de vb.net com uma bd em access, estou a guiar-me por codigos para SQL fazendo as devidas alterações os unicos erros sao os seguintes:

Quando corro o projecto, ao tentar adicionar entradas a uma determinada tabela tenho este erro:

"Syntax error in INSERT INTO statement"

Code do Click do Botao Novo (faz um teste, para ver determinados campos estão preenchidos, apos isso o botao fica com o texto salvar e era suposto salvar a entrada mas da esse erro)

Private Sub BT_new_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_new.Click
        Dim msg As String = ""
        Dim sql As String = ""
        Dim strConn As String = My.Settings.BD_SOFIOConnectionString.ToString()
        If BT_new.Text = "Novo" Then
            BT_new.Text = "Salvar"
            ListBox.Enabled = False
            'limpaControles(Me)
            NomeTextBox.Focus()
        ElseIf BT_new.Text = "Salvar" Then
            If valida() Then
                sql = "INSERT INTO contactos (ID_Contacto, ID_Empresa, Nome, Endereço de Correio Electronico, Cargo, Telefone da Empresa, Telefone Pessoal, Telemovel Pessoal, Telemovel da Empresa, Fax, Notas) VALUES('" _
                                            + ID_ContactoLabel1.Text + "','" _
                                            + ID_EmpresaComboBox.Text + "','" _
                                            + NomeTextBox.Text + "','" _
                                            + Endereço_de_Correio_ElectronicoTextBox.Text + "','" _
                                            + CargoTextBox.Text + "','" _
                                            + Telefone_da_EmpresaTextBox.Text + "','" _
                                            + Telefone_PessoalTextBox.Text + "','" _
                                            + Telemovel_PessoalTextBox.Text + "','" _
                                            + Telemovel_da_EmpresaTextBox.Text + "','" _
                                            + FaxTextBox.Text + "','" _
                                            + NotasRichTextBox.Text + "')"
                Dim con As New OleDbConnection(strConn)
                Dim cmd As New OleDbCommand(sql, con)
                Try
                    con.Open()
                    cmd.ExecuteNonQuery()
                    MsgBox("Contacto gravado com sucesso.")
                    BT_new.Text = "Novo"
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
                ListBox.Enabled = True
            Else
                MsgBox("Dados incompletos.")
                ListBox.Enabled = True
                BT_new.Text = "Novo"
            End If
        End If
    End Sub

Depois tenho outro erro que é, tenho uma list box, onde deviam aparecer todos os contactos que correspondem-se a uma pesquisa feita numa textbox, por exemplo procurava "Lu" devia aparecer todos os contactos com as letras "Lu", mas acontece que quando faço a pesquisa da o seguinte erro:

"Conversion from string "%lu%" to type 'Integer' is not valid."

Codigo do botao de pesquisa:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_search.Click
        If TextBoxsearch.Text.Trim.Length > 1 Then
            ErrorProvider.Equals(TextBoxsearch, "")
            Dim da As BD_SOFIODataSetTableAdapters.contactosTableAdapter = New BD_SOFIODataSetTableAdapters.contactosTableAdapter
            ListBox.DataSource = da.GetDataByNome("%" & TextBoxsearch.Text & "%")
            ListBox.DisplayMember = "nome"
            ListBox.ValueMember = "clienteID"
            ListBox.Refresh()
        Else
            ErrorProvider.Equals(TextBoxsearch, "Informe o nome do cliente com no mínimo 2 caracteres...")
        End If
    End Sub

Alguem me consegue ajudar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Relativamente ao primeiro erro..o melhor é fazeres o debug, parares logo depois da contrução do SQL, copia-lo e colá.lo numa consulta no access, que provavelmente o erro salta logo à vista.

Quanto ao segundo...tu podes criar uma combo desse modo que tas a fazer? o problema começa logo porque ele está à espera de um iteger (provavelmente para o Value Member) e deve tar a receber texto...

Porque não carregas a combo, directamente por codigo, com uma instrução de sql que leve em linha de conta o critério de pesquisa

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Relativamente ao primeiro erro..o melhor é fazeres o debug, parares logo depois da contrução do SQL, copia-lo e colá.lo numa consulta no access, que provavelmente o erro salta logo à vista.

Por isso é que eu aconselho SEMPRE o uso de parameters porque organizam muito melhor o código.

De qualquer maneira os campos  numéricos não têm de estar entre aspas, ou seja, não deves fazer para o campo ID: '3'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como assim nao percebi bem a resolução do primeiro erro...

e, relação ao segundo, eu nao tenho combo nenhuma a ideia era colocar o "Lu" na textbox carregar no botao de pesquisa e na listbox ele mostrar todos os contactos com "Lu", eu sei que ele esta definido como integer, eu so nao percebo e onde mudo para string

55591494.jpg

Por isso é que eu aconselho SEMPRE o uso de parameters porque organizam muito melhor o código.

De qualquer maneira os campos  numéricos não têm de estar entre aspas, ou seja, não deves fazer para o campo ID: '3'

Usar parameters como assim...desculpa a pergunta mas ainda sou muito cru nisto xD

Vou tentar fazer como disseste

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pareceme bastante mais simples vou tentar

Tentei e deu o mesmo erro :S

o que estarei eu a fazer mal?

    Private Sub BT_newpar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_newpar.Click
        Try
            Dim connection As OleDbConnection
            Dim lm As String = "INSERT contactos SET ID_Contacto=?, ID_Empresa=?, Nome=?, Endereço de Correio Electronico=?, Cargo=?, Telefone da Empresa=?, Telefone Pessoal=?, Telemovel Pessoal=?, Telemovel da Empresa=?, Fax=?, Notas=?"
            ' Inicia uma ligação à base de dados
            connection = New OleDbConnection(My.Settings.BD_SOFIOConnectionString.ToString)
            ' Define o comando e os parâmetros
            Dim command As New OleDbCommand(lm, connection)
            command.Parameters.Add("Nome", OleDbType.VarChar).Value = NomeTextBox.Text()

            ' Abre a ligação e insere o registo
            connection.Open()
            Dim x As Integer = command.ExecuteNonQuery()
            If x <> 1 Then
                Throw New ArgumentException("Não foi possível inserir o registo na base de dados!")
            End If
            connection.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

Testei apenas com o campo nome

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Testei apenas com o campo nome

Se só testaste com um nome, tens de definir só um nome no SQL, ou seja, se queres apenas testar com o nome tens de fazer:

Dim lm As String = "INSERT INTO contactos (Nome) VALUES (?)"

Reparei agora que o sintax do comando também está errado. Esse é para UPDATE e não INSERT.

NOTA: Os parametros têm de ser definidos pela ordem que foram indicados!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Com o codigo assim:

Private Sub BT_newpar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_newpar.Click
        Try
            Dim connection As OleDbConnection
            Dim lm As String = "INSERT INTO contactos (Nome) VALUES (?)"
            ' Inicia uma ligação à base de dados
            connection = New OleDbConnection(My.Settings.BD_SOFIOConnectionString.ToString)
            ' Define o comando e os parâmetros
            Dim command As New OleDbCommand(lm, connection)
            'command.Parameters.Add("ID_Empresa", OleDbType.VarChar).Value = ID_EmpresaComboBox.Text()
            command.Parameters.Add("Nome", OleDbType.VarChar).Value = NomeTextBox.Text()
            ' Abre a ligação e insere o registo
            connection.Open()
            Dim x As Integer = command.ExecuteNonQuery()
            If x <> 1 Then
                Throw New ArgumentException("Não foi possível inserir o registo na base de dados!")
            End If
            connection.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

Carrego no botao e nao faz nada, mas tambem nao adiciona registos á tabela

Com o codigo assim:

Private Sub BT_newpar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_newpar.Click
        Try
            Dim connection As OleDbConnection
            Dim lm As String = "INSERT INTO contactos (ID_Empresa, Nome) VALUES (?)"
            ' Inicia uma ligação à base de dados
            connection = New OleDbConnection(My.Settings.BD_SOFIOConnectionString.ToString)
            ' Define o comando e os parâmetros
            Dim command As New OleDbCommand(lm, connection)
            command.Parameters.Add("ID_Empresa", OleDbType.VarChar).Value = ID_EmpresaComboBox.Text()
            command.Parameters.Add("Nome", OleDbType.VarChar).Value = NomeTextBox.Text()
            ' Abre a ligação e insere o registo
            connection.Open()
            Dim x As Integer = command.ExecuteNonQuery()
            If x <> 1 Then
                Throw New ArgumentException("Não foi possível inserir o registo na base de dados!")
            End If
            connection.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

Da este erro: "Number of query values and destination fields are not the same"

:S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vamos lá ver uma coisa ... tens de olhar para o código e tentar perceber o que estás a fazer.

Se passas dois parametros tens de definir dois parametros.

Dim lm As String = "INSERT INTO contactos (ID_Empresa, Nome) VALUES (?, ?)"

Depois o tipo dos parametros não é sempre OleDbType.VarChar ... existem mais com Integer, Boolean, etc. Tens de escolher o apropriado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vamos lá ver uma coisa ... tens de olhar para o código e tentar perceber o que estás a fazer.

Se passas dois parametros tens de definir dois parametros.

Dim lm As String = "INSERT INTO contactos (ID_Empresa, Nome) VALUES (?, ?)"

Depois o tipo dos parametros não é sempre OleDbType.VarChar ... existem mais com Integer, Boolean, etc. Tens de escolher o apropriado

Sim eu isso sei dos parametros sei, falhou-me esta parte VALUES (?, ?)

Peço desculpa

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim eu isso sei dos parametros sei, falhou-me esta parte VALUES (?, ?)

Peço desculpa

Não precisas de pedir desculpa ;)

Depois diz se conseguiste por a funcionar!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não precisas de pedir desculpa ;)

Depois diz se conseguiste por a funcionar!

Não consegui....agora da este erro:

"Data Type mismatch in criteria expression"

Tenho o tipo do ID_Empresa, é uma combobox com texto apenas, como VarChar.

O estranho e quando tento inserir só o nome, o botao simplesmente nao faz nada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tens de passar o value do id e nao o texto

Mas eu neste momento tenho a combobox a funcionar sem valor nenhum, apenas texto normal, futuramente sim é para ir buscar a lista de empresas á tabelas empresa, sera por ter essa relaçao feita?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

esse erro tem a ver com os tipos de variaveis que tas a passar...int ou strings...

mostra o codigo..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

esse erro tem a ver com os tipos de variaveis que tas a passar...int ou strings...

mostra o codigo..

Ok era mesmo isso, Porque eu na tabela empresas, ao criar uma empresa fica com um ID, e liguei esse ID ao campo ID_Empresas da tabela contactos, agora criei uma empresa, e esta quase tudo a funcionar bem xD, acontece e que o botao agora tem o mesmo comportamento que tinha a pouco so com o campo nome e clico para guardar ele nao da erro mas tambem nao cria o registo na tabela.

Private Sub BT_newpar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_newpar.Click
        Try
            Dim connection As OleDbConnection
            Dim lm As String = "INSERT INTO contactos (ID_Empresa, Nome) VALUES (?, ?)"
            ' Inicia uma ligação à base de dados
            connection = New OleDbConnection(My.Settings.BD_SOFIOConnectionString.ToString)
            ' Define o comando e os parâmetros
            Dim command As New OleDbCommand(lm, connection)
            command.Parameters.Add("ID_Empresa", OleDbType.Integer).Value = ID_EmpresaComboBox.Text()
            command.Parameters.Add("Nome", OleDbType.VarChar).Value = NomeTextBox.Text()
            ' Abre a ligação e insere o registo
            connection.Open()
            Dim x As Integer = command.ExecuteNonQuery()
            If x <> 1 Then
                Throw New ArgumentException("Não foi possível inserir o registo na base de dados!")
            End If
            connection.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

O ID_Empresa era suposto identicar a empresa pelo ID mas na combo aparecer o nome da empresa e nao o ID, mas isso e detalhes para mais tarde xD

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

INSERT INTO contactos (ID_Empresa, Nome) VALUES (3, 'teste')

corre isto dentro do acess e ve se cria um registo...

no lugar do 3 mete um id de uma empresa existente

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

INSERT INTO contactos (ID_Empresa, Nome) VALUES (3, 'teste')

corre isto dentro do acess e ve se cria um registo...

no lugar do 3 mete um id de uma empresa existente

Desculpa a ignorancia mas como corro isso no acess?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

vais ao criar--depois design da consulta--depois vai abrir uma janelinha dizes k ueres fechar...e vai aparecer um icom sql modo exibicao copias o insert para la e executas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

vais ao criar--depois design da consulta--depois vai abrir uma janelinha dizes k ueres fechar...e vai aparecer um icom sql modo exibicao copias o insert para la e executas

Adicionou

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ID_EmpresaComboBox.Text()  o que leva isto exctamente nome de uma empresa?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ID_EmpresaComboBox.Text()  o que leva isto exctamente nome de uma empresa?

Por enquanto nao tem nada, mas é para levar os nomes das empresas ligados a um ID, mas o nome so aparece mesmo na combo porque eu ao selecionar empresa X que corresponde ao numero 1 ele mete na BD o numero 1

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

isso tem de ir com um id pq na bd esse campo esta a espera de um int..

experimenta

command.Parameters.Add("ID_Empresa", OleDbType.Integer).Value = 1 e corre o codigo a ver se n insere

no lugar do 1 mete um id de uma empresa existente

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

isso tem de ir com um id pq na bd esse campo esta a espera de um int..

experimenta

command.Parameters.Add("ID_Empresa", OleDbType.Integer).Value = 1 e corre o codigo a ver se n insere

no lugar do 1 mete um id de uma empresa existente

Assim dessa forma funcionou, mas ele nao adiciona o registo mas tambem nao da erro nenhum e nao consigo perceber com o debug onde ele para, mas eu vou construir a BD de novo porque com a mexida que ja levou dame ideia de ter alguns erros

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora