Ir para conteúdo
Fórum Script Brasil
  • 0

como obter dados de BD access pelo VB?


Humm

Pergunta

salve galera..

bom, sou intermediario em programacao VBA.. mas devido a dependência das aplicações access ao proprio access, e tambem por querer seguir um caminho mais profissional, decidi experimentar o visual studio 2010 e deixar o access de lado como aplicação.. por enquanto usa-lo so como BD.

porem no futuro espero migrar tambem pro mysql ou firebird que são SGBDs bem amigaveis.

mas tenho percebido que há muita diferença entre vba e vb.net e tambem a ausencia de funcoes agregadas muito comuns como dlookup, seimed, etc..

eu ainda não entendi como um windows form, ou o projeto em si dentro do visual studio faz pra se conectar ao banco de dados..

minha ideia era deixar os forms não conectados a fonte de dados.. sendo assim..

num cadastro de clientes por exemplo, o form so captura as variaveis das textboxs e depois ao apertar em salvar, uma SQL INSERT insere os dados no BD.. o mesmo seria ao editar dados e tambem de excluir.

o lance é que eu não to entendendo bulhufas de como rodar SQL de forma programatica.. como conectar no BD.. etc e tal..

por exemplo, eu to empacado num form de entrada da aplicacao.. esse form deveria comparar os dados da textbox usuario com os usuarios da tabela USUARIOS me retornando valor boleano true ou false caso não encontre o usuario..

com dllokup eu faria isso facil.. até tentei achar alguma function similar pelo google, mas as que achei não funcionam.

por exemplo essa:

Function DLookup(ByVal SearchFld As String, ByVal SearchTbl As String, ByVal _
SearchCriteria As String) As Object
        
        Dim Cmd As OleDb.OleDbCommand
        Dim Reader As OleDb.OleDbDataReader
        Dim Value As Object = DBNull.Value

        DLookup = Nothing
        Cmd = New OleDb.OleDbCommand("SELECT " & SearchFld & " FROM " & SearchTbl & " WHERE " & SearchCriteria)
        Reader = Cmd.ExecuteReader()
        If Microsoft.VisualBasic.Left(SearchFld, 1) = "[" Then
            SearchFld = Microsoft.VisualBasic.Right(SearchFld,
            Microsoft.VisualBasic.Len(SearchFld) - 1)
        End If
        If Microsoft.VisualBasic.Right(SearchFld, 1) = "]" Then
            SearchFld = Microsoft.VisualBasic.Left(SearchFld,
            Microsoft.VisualBasic.Len(SearchFld) - 1)
        End If
        If (Reader.Read()) Then
            Value = IIf(Reader.GetValue(Reader.GetOrdinal(SearchFld)) Is Nothing, "",
            Reader.GetValue(Reader.GetOrdinal(SearchFld)))
        End If
        DLookup = Value

    End Function

mas ao usar a funcao, da erro:

system.InvalidOperationExcepted

{"ExecuteReader: Connection property has not been initialized."}

e aponta para a linha:

Reader = Cmd.ExecuteReader()

bom, já procurei no google sobre varias formas de se conectar, obter, incluir, editar e apagar dados ao BD mas não to entendendo nada.. se alguém tiver co mboa vontade de explicar.. ou indicar material pra leitura.. fico grato

valeu

Link para o comentário
Compartilhar em outros sites

18 respostass a esta questão

Posts Recomendados

  • 0

Bem vindo ao mundo do VS2010! Mais especificamente ao VB.Net :D

Irá gostar!

Bom, vamos ao que interessa: sugiro que monte uma classe que contenha todas as suas funções no banco de dados. Você está fazendo tudo certinho, com exceção de instanciar a conexão com o banco de dados. O VS2010 já fornece alguns provedores de conexão com o banco. O OleDB é um deles, assim como SQL e tantos outros. Cada provedor possui uma string de conexão específica, que permitirá a conexão com o banco de dados escolhido.

As vezes fica difícil de se lembrar qual a ordem e string corretas de conexão. Pra isso, usamos o ConnectionStrings. Nesse seu caso, seria a seguinte, com o Access 2007:

Dim minhaConexao As OleDBConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=caminhoBD\meuBD.accdb;Persist Security Info=False;")
Pronto. Sua conexão está montada. Na classe que sugeri acima, com funções de banco de dados, você criar o método Conectar. Nisso, você passa a string de conexão e dá um minhaConexao.Open(), para indicar que irá iniciar as ações (INSERT, UPDATE...) no banco. Depois fica tranquilo, todo o código que postou acima, funcionaria se tivesse iniciado a conexão da forma que expliquei. O único porém é que teria que vincular a conexão ao OleDBCommand. No seu código, ficaria assim:
Dim minhaConexao As OleDBConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=caminhoBD\meuBD.accdb;Persist Security Info=False;")
        Dim Cmd As OleDb.OleDbCommand
        Dim Reader As OleDb.OleDbDataReader
        Dim Value As Object = DBNull.Value

        DLookup = Nothing
                Cmd.Connection = minhaConexao
        Cmd = New OleDb.OleDbCommand("SELECT " & SearchFld & " FROM " & SearchTbl & " WHERE " & SearchCriteria)
        Reader = Cmd.ExecuteReader()

Espero ter ajudado!

Editado por Xistyle
Link para o comentário
Compartilhar em outros sites

  • 0

antes de mais nada.. grato.

fiz como indicou, ajustei a string para o path do bd, porem no debug essa linha da string fica sublinhada e quando você deixa o mouse em cima da a mensagem:

"limites de matriz não podem aparecer em especificadores do tipo"

ahhh só um detalhe.. esse BD é em access 2010, então o OLEDB.12 seria OLEDB.14 correto?

outro detalhe é que esse DB é protegido por senha.. onde eu adiciona a senha na string?

Link para o comentário
Compartilhar em outros sites

  • 0

Bom... com password seria essa string:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=caminhoBD\meuBD.accdb;Jet OLEDB:Database Password=minhaSenha;

Tente manter o provedor OleDB12. Qualquer novo problema, poste com seu código :)

Editado por Xistyle
Link para o comentário
Compartilhar em outros sites

  • 0

Module bas_DLookup
    Function DLookup(ByVal SearchFld As String, ByVal SearchTbl As String, ByVal _
SearchCriteria As String) As Object
        Dim minhaConexao As OleDBConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Syscontrol\BD.accdb;Jet OLEDB:Database Password=xxxxxxxx;")
        Dim Cmd As OleDb.OleDbCommand
        Dim Reader As OleDb.OleDbDataReader
        Dim Value As Object = DBNull.Value

        DLookup = Nothing
        Cmd.Connection = minhaConexao
        Cmd = New OleDb.OleDbCommand("SELECT " & SearchFld & " FROM " & SearchTbl & " WHERE " & SearchCriteria)
        Reader = Cmd.ExecuteReader()
        If Microsoft.VisualBasic.Left(SearchFld, 1) = "[" Then
            SearchFld = Microsoft.VisualBasic.Right(SearchFld,
            Microsoft.VisualBasic.Len(SearchFld) - 1)
        End If
        If Microsoft.VisualBasic.Right(SearchFld, 1) = "]" Then
            SearchFld = Microsoft.VisualBasic.Left(SearchFld,
            Microsoft.VisualBasic.Len(SearchFld) - 1)
        End If
        If (Reader.Read()) Then
            Value = IIf(Reader.GetValue(Reader.GetOrdinal(SearchFld)) Is Nothing, "",
            Reader.GetValue(Reader.GetOrdinal(SearchFld)))
        End If
        DLookup = Value

    End Function

End Module

DEBUG:

Erro 1 Limites de matriz não podem aparecer em especificadores de tipo. C:\Users\Andre\Documents\Visual Studio 2010\Projects\SysControl\SysControl\bas_DLookup.vb 4 45 SysControl

Erro 2 'minhaConexao' não está declarado. Ele pode ser inacessível devido ao seu nível de proteção. C:\Users\Andre\Documents\Visual Studio 2010\Projects\SysControl\SysControl\bas_DLookup.vb 10 26 SysControl

Link para o comentário
Compartilhar em outros sites

  • 0

Sinceramente não estou familiarizado com o objeto OleDbDataReader. Fiz um exemplo alimentando um DataSet.

Module bas_DLookup

  Public Function DLookup(ByVal SearchFld As String, ByVal SearchTbl As String, ByVal SearchCriteria As String) As Object

        Dim minhaConexao As New OleDBConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Syscontrol\BD.accdb;Jet OLEDB:Database Password=xxxxxxx;")
        Dim Cmd               As OleDb.OleDbCommand
        Dim meuDataSet    As New DataSet
        Dim meuDataAdap As OleDbDataAdapter
        Dim Value              As Object = DBNull.Value

        DLookup = Nothing

        Cmd.Connection = minhaConexao
        Cmd = New OleDb.OleDbCommand("SELECT " & SearchFld & " FROM " & SearchTbl & " WHERE " & SearchCriteria)
        meuDataAdap = New OleDbDataAdapter(cmd, minhaConexao)

        meuDataAdap.Fill(meuDataSet, "Resultado")

        If Microsoft.VisualBasic.Left(SearchFld, 1) = "[" Then
            SearchFld = Microsoft.VisualBasic.Right(SearchFld, Microsoft.VisualBasic.Len(SearchFld) - 1)
        End If

        If Microsoft.VisualBasic.Right(SearchFld, 1) = "]" Then
            SearchFld = Microsoft.VisualBasic.Left(SearchFld, Microsoft.VisualBasic.Len(SearchFld) - 1)
        End If

        If (Reader.Read()) Then
            Value = IIf(meuDataSet.Tables("Resultado").Rows(0)(SearchFld).ToString() Is Nothing, "",  meuDataSet.Tables("Resultado").Rows(0)(SearchFld).ToString())
        End If

        DLookup = Value

    End Function

End Module

Isso no caso de retornar apenas uma linha. Inseri também o New para instaciar a conexão.

PS: desculpe pelo código, não cheguei a testar. Estou meio enrolado aqui no serviço :x Pode ter alguns errinhos de sintaxe/semântica.

Editado por Xistyle
Link para o comentário
Compartilhar em outros sites

  • 0

sem problemas.. eu já tinha colocado o NEW la pra testar, mas ao fazer isso, ele acusa que OleDBConnection não esta declarado como se não fosse uma function

sinceramente eu to achando que OleDBConnection funciona para VB 2008.. mas para o vb2010 acho que é diferente o comando.. parece q tiveram trocentas mil mudanças entre as versoes.. tornaram obsoletos varios comandos, e mudaram outros

Editado por Humm
Link para o comentário
Compartilhar em outros sites

  • 0

Na verdade acho que o problema é com o Access 2010. O provider ou a string de conexão.

Usando o seu código, coloque o OleDb.OleDbConnection, assim como fez para o OleDb.OleDbCommand.

Olhe como o rapaz usou o OleDb, só que com Access 2003: OleDbConnection

Tente isso também:

Dim minhaConexao As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=caminhoBD\meuBD.accdb;Jet OLEDB:Database Password=xxxx; Persist Security Info=False;")
minhaConexao.CursorLocation = adUseClient

Antes do ExecuteReader() dê um minhaConexao.Open().

UPDATE: o driver de conexão do Access 2007 e 2010 são os mesmos.

Editado por Xistyle
Link para o comentário
Compartilhar em outros sites

  • 0

então, fiz assim:

Module bas_DLookup
    Function DLookup(ByVal SearchFld As String, ByVal SearchTbl As String, ByVal _
SearchCriteria As String) As Object
        Dim minhaConexao As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Syscontrol\BD.accdb;Jet OLEDB:Database Password=xxxxx;")
        Dim Cmd As OleDb.OleDbCommand
        Dim Reader As OleDb.OleDbDataReader
        Dim Value As Object = DBNull.Value
        minhaConexao.Open()
        DLookup = Nothing
        Cmd.Connection = minhaConexao
        Cmd = New OleDb.OleDbCommand("SELECT " & SearchFld & " FROM " & SearchTbl & " WHERE " & SearchCriteria)

        Reader = Cmd.ExecuteReader()
        If Microsoft.VisualBasic.Left(SearchFld, 1) = "[" Then
            SearchFld = Microsoft.VisualBasic.Right(SearchFld,
            Microsoft.VisualBasic.Len(SearchFld) - 1)
        End If
        If Microsoft.VisualBasic.Right(SearchFld, 1) = "]" Then
            SearchFld = Microsoft.VisualBasic.Left(SearchFld,
            Microsoft.VisualBasic.Len(SearchFld) - 1)
        End If
        If (Reader.Read()) Then
            Value = IIf(Reader.GetValue(Reader.GetOrdinal(SearchFld)) Is Nothing, "",
            Reader.GetValue(Reader.GetOrdinal(SearchFld)))
        End If
        DLookup = Value

    End Function



End Module

agora ele passa pelo debug e executa o form..

mas quando tento disparar uma funcao dlookup da erro:

Nullreferenceexception não foi manipulada.

Object reference not set to an instance of an object.

e aponta para linha:

Cmd.Connection = minhaConexao

rapaz, penozo de fazer isso funcionar.

como eu posso testar uma conexao simples pra extrair apenas um dado só pra efeito de teste?

por exemplo.. tenho uma sqlstring já montada:

my_user aponta para o text digitado de uma textbox

"SELECT USUARIOS.USER, USUARIOS.ATIVO FROM(USUARIOS) WHERE (((USUARIOS.USER)=" & my_user & ") AND ((USUARIOS.ATIVO)=True));"

como faço para um evento qualquer conectar o accdb, executar essa sql e atribuir o resultado dela numa variavel TEMP ?

Editado por Humm
Link para o comentário
Compartilhar em outros sites

  • 0

posso converter em outra versao.. qual você tem?

nisso me surgiu uma duvida.. quando eu for distribuir minhas aplicacoes.. se estas usarem banco de dados access 2010, a maquina ao qual vai ser instalada a app, tem q ter no minimo o runtime do access 2010 pra poder funcionar?

Editado por Humm
Link para o comentário
Compartilhar em outros sites

  • 0

Isso facilita as coisas. Pois o Access 2010 consegue ler ambas versões. Mas não o contrário. Provavelmente exista alguma modificação na versão 2010 que impeça o 2007 de ler. Com isso, você mata o problema de compatibilidade. Monte seu BD em 2007, pois se o cliente tiver o Acess 2007 ou 2010, irá ler sem problemas.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...