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

Joao C.

Base Dados Acess Com Vb net...uma dor de cabeça

Recommended Posts

Joao C.

Bom dia a todos,

Desde já quero dizer que sou novo no vosso forum (apesar de utilizar muito a vossa wiki na secção vb net...ajudo-me imenso) e que precisava da vossa sabedoria para resolver um problema que me anda a moer a cabeça á algum tempo.

O problema é o seguinte:

Estou a fazer um projecto que precisa de guardar umas 6 definições. Estas definições estão distribuídas em varias textbox's em um form e são guardadas numa base de dados em acess.

Pelo que tive a ler devo utilizar sql com parâmetros (para ele ir buscar o conteudo das variáveis), então seguindo a ordem de raciocinio fiz 2 query's com a ajuda do Tableadpater Query configuration, insert, select  respectivamente. Agora o meu problema é que só a instrução select é que funciona.

Aqui vai o meu codico:

Instrução Sql:
INSERT INTO Definições (Bloquear, Smtp, Pop3,  Login, [Password])
VALUES        (?, ?, ?, ?, ?)

Depois executo a instrução num botão "concluir" no respectivo form da seguinte forma

Instrução vb:

DefiniçõesTableAdapter1.InsertQuery(BloquearTextBox.Text, SmtpTextBox.Text, Pop3TextBox.Text, LoginTextBox.Text, PasswordTextBox.Text)

Por incrível que pareça, quando faço debug não aparece nenhum erro....mas infelizmente não escreve nada na base de dados. A minha teoria é que o sql não esta a passar o conteudo dos parametros, pois se eu fizer a mesma instrução com atribuição directa (ou seja sem parâmetros) ele funciona bem.

Peço a vossa ajuda, porque já estou em entrar um pouco em desespero com a questão, provavelmente deve ser um erro básico mas como sou novo em vb net (migrei do vb 6) ainda estou a aprender....

Os melhores cumprimentos

Agradeço a vossa ajuda

Share this post


Link to post
Share on other sites
jnetic

Quando corres um programa em debug, o Visual Studio copia o teu projecto (incluíndo os ficheiros access onde estás a ligar os dados) para a pasta bin. Isto ocorre sempre que corres o debug. Talvez seja por isto que não estás a conseguir consultar os dados guardados.

Tenta ver se os dados estão correctamente inseridos no ficheiro access que encontras dentro da pasta bin, do teu projecto.

🤔

Share this post


Link to post
Share on other sites
security

ou seja estas a usar uma textbox, certo?!

ve entao se este codigo te ajuda!!!

maindb() 'caminho da BD esta num modulo
            Dim strSQL As String = "INSERT INTO tbl_clientes (nome) VALUES (@nome)" 'instrução inserir
            Dim cmd As New OleDbCommand(strSQL, coNn) 'cria o comando e passa os parametros
            cmd.Parameters.Add("@nome", OleDbType.VarChar)
            cmd.Parameters("@nome").Value = TextBox18.Text
            coNn.Open()
            cmd.ExecuteNonQuery()
            coNn.Close()

ve se percebes. espero ter ajudado :)


"Innovation distinguishes between a leader and a follower." Steve jobs.

Share this post


Link to post
Share on other sites
Joao C.

Sim, estou a usar textbox. Quanto ao código percebi, apesar de não ser grande coisa em linguagens de bd acho sql relativamente acessivel. Só não sei onde eu encontro o maindb() no meu projecto.... podes dar-me algumas orientações?

Só outra questão, sendo a minha base de dados em acess, não existe nenhuma maneira de inserir e actualizar dados mais simples?

Obrigado desde já...

Ps: jnetic, não infelizmente não é isso....mas obrigado por tentares.

Share this post


Link to post
Share on other sites
security

maindb() é uma função que tem no modulo que eu crie, onde está o caminho da base de dados

abaixo vou enviar-te o codigo que tenho no meu modulo como exemplo

Sub maindb()
        coNn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\myDB.mdb"
    End Sub

isto serve para simplificar o codigo e evitar erros no caminho. quando quiseres chamar a BD basta utilizar o nome da função.

Quanto ao Update também estou com algumas dificuldades no meu projecto de estagio mas a sintaxe e deste genero:

Dim sql As String = "Update Clientes set Nome='" & area2.Text & "'"
                    sql = sql & ", Email='" & vazio & "'"
                    sql = sql & ", Morada='" & area5.Text & "'"
                    sql = sql & ", Freguesia='" & area7.Text & "'"
                    sql = sql & ", Cod_Postal='" & area6.Text & "'"
                    sql = sql & ", Localidade='" & area8.Text & "'"
                    sql = sql & ", Contacto='" & area4.Text & "'"
                    sql = sql & ", Notas='" & vazio & "'"
                    sql = sql & " WHERE Cod_cliente =" & area1.Text
                    manipulaRegistos(sql)

ATENÇÃO: Não tenho certeza de que este codigo esteje correcto, mas é algo mais ou menos deste genero!

P.S.: O codoigo que estou a dar-te é para access.


"Innovation distinguishes between a leader and a follower." Steve jobs.

Share this post


Link to post
Share on other sites
duduml

Boas....

só um aparte...antes de mais...

Sub maindb()

        coNn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\myDB.mdb"

    End Sub

se puseres isso num modulo, fica acessivel a toda a aplicação e não apenas á classe...:) aprendi isso ontem...lol

em realação a actualização/alteração de dados....eu já fiz isso, mas de forma diferente...sem utilizar sintaxe SQL... assim, neste caso acho que não posso ajudar...:S

CUMPS


"use windows, você merece!"

Share this post


Link to post
Share on other sites
Joao C.

Bem...desde já obrigado pelo código....estas a ser uma grande ajuda!

Estou a implementa-lo no meu projecto agora mesmo, security tu fizes-te algum import para utilizares as expressões OleDbCommand, coNn.ConnectionString e OleDbType? É que o ide não me esta a reconhecer as expressões.

Obrigado.

Ps: Duduml, já que o meu objectivo é aprender vb net, podes-me dizer a outra alternativa que usas alem do sql? Quanto aos modulos dão bastante jeito, já os usava no vb6. Obrigado

Share this post


Link to post
Share on other sites
security

Sim fiz.

Imports System.Data.OleDb

mas aconselho-te tanto no inserir como no actualizar em ires inserindo um valor de cada vez e ires exprimentando, pois se der erro sabes logo em que linha foi :)


"Innovation distinguishes between a leader and a follower." Steve jobs.

Share this post


Link to post
Share on other sites
duduml

eis o código que eu usei...á primeira vista, parece confuso, mas nem é assim tanto...:) este código é do livro VB 2008 - Curso completo ; editora FCA

If Validar_dados() = False Then Exit Sub
        Dim adapter_familia As New BD_StocksDataSetTableAdapters.familiaTableAdapter
        Try
            adapter_familia.Update(Me.Nome_familiaTextBox.Text, Me.Cód_familiaTextBox.Text, _
                                   nome_familia_anterior, cod_familia_anterior)
            MsgBox("Registo alterado com sucesso!", MsgBoxStyle.Information, Me.Text)
        Catch ex As Exception
            MsgBox(ex.Message)
            Me.Cód_familiaTextBox.SelectAll()
            Me.Cód_familiaTextBox.Focus()
        End Try
        Me.Close()

CUMPS


"use windows, você merece!"

Share this post


Link to post
Share on other sites
security

este codigo parece um pouco confuso!!!


"Innovation distinguishes between a leader and a follower." Steve jobs.

Share this post


Link to post
Share on other sites
Joao C.

Edit: Depois de resolver o erro, acontece exactamente o mesmo, a instrução aparentemente funciona mas nao adiciona dado nenhum á base de dados....aqui esta o meu código  😡

Dim coNn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\AlexIn_bd.mdb")
    Sub maindb()
        coNn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\AlexIn_bd.mdb"
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim strSQL As String = "INSERT INTO Def (Bloquear, Ssl,Smtp, Pop3,  Login, [Password]) VALUES (@Bloquear,@Smtp,@Ssl,@Pop3,@Login,@Password)" 'instrução inserir
        Dim cmd As New OleDbCommand(strSQL, coNn) 'cria o comando e passa os parametros
        Dim var_ssl As Boolean = False
        If SslComboBox.Text = "Sim then" Then
            var_ssl = True
        End If
        cmd.Parameters.Add("@Bloquear", OleDbType.VarChar)
        cmd.Parameters("@Bloquear").Value = BloquearTextBox.Text
        cmd.Parameters.Add("@Ssl", OleDbType.Boolean)
        cmd.Parameters("@Ssl").Value = var_ssl
        cmd.Parameters.Add("@Smtp", OleDbType.VarChar)
        cmd.Parameters("@Smtp").Value = SmtpTextBox.Text
        cmd.Parameters.Add("@Pop3", OleDbType.VarChar)
        cmd.Parameters("@Pop3").Value = Pop3TextBox.Text
        cmd.Parameters.Add("@login", OleDbType.VarChar)
        cmd.Parameters("@Login").Value = LoginTextBox.Text
        cmd.Parameters.Add("@Password", OleDbType.VarChar)
        cmd.Parameters("@Password").Value = PasswordTextBox.Text
        coNn.Open()
        cmd.ExecuteNonQuery()
        coNn.Close()
        AleXplorer_main.Show()
    End Sub

Ps: Obrigado pelo teu código duduml

Share this post


Link to post
Share on other sites
Joao C.

Se é para conter tão poucos dados não seria melhor colocar essa informação num arquivo XML ?

Acha que fica melhor organizado? é que o projecto tem 4 tabelas alem desta....

Tudo é muito estranho porque realmente não escreve na base de dados mas também não dá erro nenhum....preciso mesmo de alguma ajuda nisto

Obrigado

Share this post


Link to post
Share on other sites
security

para começar nao e necessarioa 2ª, 3ª e 4ª linha. basta a 1ª linha.

depois a variavel var_ssl deves pola logo no inicio. para que ao correres o programa ela fique logo definida como False. de resto o código parece estar bem. exprimenta colocar apenas um valor na instrução inserir e exprimenta. se registar poes mais um, e assim sicessivamente.

outro conselho é nao utilizares palavras como "login" e "password" porque pode o programa pode entrar em conflito por serem palavras-chave


"Innovation distinguishes between a leader and a follower." Steve jobs.

Share this post


Link to post
Share on other sites
Joao C.

Hum...sim tens razão já meti a variável declarada no topo. Quanto a 2 3 e 4 linha não percebi muito bem onde querias chegar....podes-me dar um exemplo com o que queres dizer? Será por isso que o meu projecto não consegue inserir na base de dados?

Obrigado

Share this post


Link to post
Share on other sites
Joao C.

Muito obrigado Security e bioshock já consegui resolver o erro.

Mudei a conexão para

Dim coNn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;_
Data Source=C:\Users\Alexandre\Desktop\Visual Studio 2008\Projects\AlexIn\AlexIn\AlexIn_bd.mdb;Persist Security Info=False;")

Um grande obrigado para vocês!

Share this post


Link to post
Share on other sites
bioshock

Queres mesmo que tenha esse directório? A aplicação só vai funcionar em tua casa? Se por ventura quiseres pegar na aplicação e instala-la noutro sitio, isso vai dar barraca..

Btw, eu apenas te mostrei 3 links existem pelo menos mais meia dúzia deles. Basta procurarem um pouco antes de criarem um tópico.

Share this post


Link to post
Share on other sites
Joao C.

Queres mesmo que tenha esse directório? A aplicação só vai funcionar em tua casa? Se por ventura quiseres pegar na aplicação e instala-la noutro sitio, isso vai dar barraca..

Btw, eu apenas te mostrei 3 links existem pelo menos mais meia dúzia deles. Basta procurarem um pouco antes de criarem um tópico.

Não a aplicação era para funcionar em vários computadores....como faço para resolver a situação?

Pois tem razão mas as vezes é difícil quando se é verde na linguagem separar o trigo do do joio no meio de tanta informação existente...

Obrigado

Share this post


Link to post
Share on other sites
bioshock

Trata-me por tu :D

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & My.Application.Info.DirectoryPath & "\AlexIn_bd.mdb';Persist Security Info=True;"

Não te esqueças de copiar a tua base de dados para a pasta bin\debug\ do programa  ;)

Share this post


Link to post
Share on other sites
Joao C.

Trata-me por tu :D

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & My.Application.Info.DirectoryPath & "\AlexIn_bd.mdb';Persist Security Info=True;"

Não te esqueças de copiar a tua base de dados para a pasta bin\debug\ do programa  ;)

Obrigado Bioshock pela ajuda, funciona perfeitamente! :cheesygrin:

Share this post


Link to post
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

×

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.