View Full Version : VB.NET (2005) e Access


Py_
03-03-2008, 22:22
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_

mOrSa
04-03-2008, 10:39
Não sei como estás a fazer mas se queres inserir os dados via sql eu pensava em qq coisa deste género:


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!

kzip
04-03-2008, 12:35
ADOBD? ou ADODB?

Py_
04-03-2008, 13:17
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??

mOrSa
04-03-2008, 14:37
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!

Py_
04-03-2008, 17:48
Será que podes ajudar a fazer isso??

mOrSa
04-03-2008, 22:12
Sim, claro! No topo do teu formulário declaras:
Private Dados As New DatatableE 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

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 SubPosteriormente podes aceder a qualquer uma das linhas através de
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.
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.

Py_
06-03-2008, 17:32
Boas, obrigadissimo resolvi a questão bindingnavigator mas obrigado pela dica na mesma...

Cumprimentos,
Py_

mOrSa
07-03-2008, 11:00
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!

Py_
07-03-2008, 11:56
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...

soaked
07-03-2008, 17:51
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.

SFSS
12-03-2008, 17:20
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