VB.NET (2005) e Access

Py_

Power Member
Estou a criar um programa de gestão de doentes em vb.net com a base de dados em access... Já tenho todo o visual criado e as caixas de inserção dos dados mas essas mesmas caixas de texto que servem para a inserção deveriam servir para inserir ou actaulizar os dados pelo que gostaria de criar um recordset (visto que os datareaders só é possível ver do primeiros para o último) para que pode-se navegar nos pacientes conforme o paciente que deseja-se utilizar... o problema é que não consigo criá-lo...

Estou a usar a seguinte linha de código para tentar criar o recordset.

Dim rs As ADOBD.recordset
O vb não reconhece esta parte "ADOBD.recordset" o erro é que o tipo não foi definido.... alguém que já utilizou puderá ajudar-me??

Cumps,
Py_
 
Não sei como estás a fazer mas se queres inserir os dados via sql eu pensava em qq coisa deste género:

Código:
   Private Sub InsereBD()
      Dim cmd As New OleDb.OleDbCommand
      ' a string com a query
      cmd.CommandText = "INSERT INTO Tabela( campo1, campo2) Values (@campo1, @campo2)"
      ' adicionar os parametros - NOTA IMPORTANTE - em access tens que os especificar pela ordem em que aparecem 
      cmd.Parameters.AddWithValue("@campo1", "valor do campo1")
      cmd.Parameters.AddWithValue("@campo2", "valor do campo2")

      Try
         cmd.Connection = New OleDbConnection("string de ligacao")
         cmd.Connection.Open()
         cmd.ExecuteNonQuery()
      Catch ex As Exception
         MsgBox("Ocorreram Erros: " & ex.Message)
      Finally
         If cmd.Connection.State = ConnectionState.Open Then
            cmd.Connection.Close()
         End If
      End Try
   End Sub

Espero ter ajudado!
1Abraço!
 
Sim, eu faço dessa maneira para enviar os dados para a base de dados... mas ao ler eu queria ler os registos individualmente como se fazia com os recordset utilizados em vb6... alguém sabe??
 
Obtens os valores da base de dados, na totalidade, e coloca-os numa datatable ou num dataset. Depois é só incrementares o indice da linha (datarow) e obtens cada uma das linhas, é como incrementares o teu "recordset". Penso que sirva para o que pretendes.
No caso de quereres usar um Cursor, na essência da palavra, não faço ideia. Nunca precisei disso e no que diz respeito à ligação é mais provável de "estoirar" a aplicação uma vez que tens sempre a ligação à BD aberta (penso eu de que...)

1abraço!
 
Sim, claro! No topo do teu formulário declaras:
Código:
Private Dados As New Datatable
E no corpo do programa (podes optar inclusivamente através de um dos eventos como form.Load ou um button.Click
e chamas o código para obteres os dados
Código:
   Private Sub ObtemDados()
      Dim cmd As New OleDb.OleDbCommand
      Dim da As New OleDb.OleDbDataAdapter
      ' a string com a query
      cmd.CommandText = "SELECT * FROM Tabela "

      Try
         cmd.Connection = New OleDb.OleDbConnection("string de ligacao")
         da.SelectCommand = cmd
         ' limpar a tabela
         dados.Clear()
         da.Fill(dados)       
      Catch ex As Exception
         MsgBox("Ocorreram Erros: " & ex.Message)
      Finally
         If cmd.Connection.State = ConnectionState.Open Then
            cmd.Connection.Close()
         End If
      End Try
   End Sub
Posteriormente podes aceder a qualquer uma das linhas através de
Código:
dados.Rows(numero_linha).Item("nome_da_coluna_da_base_de_dados")
As linhas começam no zero e vou supor que estás a consultar um registo de cada vez.
Código:
Private indice_actual As Integer = 0

Private Sub ProximoRegisto(...) Handles Button1.Click
    ' codigo dentro do botão
    indice_actual +=1
    'aplicar os dados actuais, por exemplo um aluno
    TextBox1.Text = dados.Rows(indice_actual).Item("Nome_Aluno").ToString
    TextBox2.Text = dados.Rows(indice_actual).Item("Morada_Aluno").ToString 
End Sub
Espero que seja perceptível.
1 Abraço

PS - Três resalvas:
- pode ser feito com outro tipo de recursos para não "saturar" a aplicação com dados e/ou obter dados mais recentes e por questões de limites de memória
- um Select * From Tabela pode ser "demasiado" grande e o tempo de TimeOut da ligação verificar-se curto.
- podes sempre recorrer à mesma função incluindo, na query, o id do último utilizador: "Select Top 1 * From Tabela Where id_aluno > " & dados.Rows(indice_actual).Item("id_alunol").ToString " para o seguinte, usando <, para o anterior, respectivamente.
 
Pá... essa treta do binding... :| não comento! Já me lixei à conta disso e no dia que estoirou... tive que me responsabilizar por causa disso... saiu-me caro :|
Good luck! :) Abraço!
 
pois mas não consegui fazer doutra forma.. té agora só tinha usado vb.net com o asp e é bem diferente... mas obrigado na mesma...
 
Só para complementar. Tens um objecto que é um datareader que itera pelos objectos do Command que faz acesso à BD.

Basicamente o reader serve para fazeres o select e em vez de tares a por os dados num dataset e num datatable, iteras pela collection de registos e colocas na List da tua Classe


Se ainda estiveres interessado pesquisa sobre isso.
 
Para ler os registos 1 a 1, podes fazer assim....

Dim SQL_Connection as New SQL_Connection("ConnectionString")

Dim SQL_Command as New SQL_Command("SELECT * FROM XPTO ORDER BY cod",SQL_Connection)

SQL_Connection.Open
Dim SQL_Reader as SQL_DataReader = SQL_Command.ExecuteReader
While SQL_Reader.Read

campo1.text = SQL_Reader.Item("campo1db").tostring
campo2.text = SQL_Reader.Item("campo2db").tostring
campo3.text = SQL_Reader.Item("campo3db").tostring

End While
SQL_Connection.Close

Ve lá se isto de ajuda....
Abraços
 
Última edição:
Back
Topo