Ir para o conteúdo
  • 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

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

:hmm:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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  :mad:

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! :biggrin:

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.