Jump to content
passado

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

Recommended Posts

passado

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?

Share this post


Link to post
Share on other sites
José Lopes

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


Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Share this post


Link to post
Share on other sites
jpaulino

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'

Share this post


Link to post
Share on other sites
passado

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

Share this post


Link to post
Share on other sites
passado

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

Share this post


Link to post
Share on other sites
jpaulino

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!

Share this post


Link to post
Share on other sites
passado

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

Share this post


Link to post
Share on other sites
jpaulino

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

Share this post


Link to post
Share on other sites
passado

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

Share this post


Link to post
Share on other sites
jpaulino

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!

Share this post


Link to post
Share on other sites
passado

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

Share this post


Link to post
Share on other sites
passado

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?

Share this post


Link to post
Share on other sites
esquima

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

mostra o codigo..

Share this post


Link to post
Share on other sites
passado

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

Share this post


Link to post
Share on other sites
esquima

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

Share this post


Link to post
Share on other sites
passado

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?

Share this post


Link to post
Share on other sites
esquima

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

Share this post


Link to post
Share on other sites
passado

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

Share this post


Link to post
Share on other sites
passado

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

Share this post


Link to post
Share on other sites
esquima

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

Share this post


Link to post
Share on other sites
passado

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.