PDA

View Full Version : [VB. Net] Lettura database


deviato
11-03-2010, 12:49
Salve a tutti.
Il mio problema può sembrare una sciocchezza ma io non ci sto piu capendo niente.. :muro:
Ho programmato molto con visual basic 6 e ho fatto tanti bei programmini interfacciati con i miei database. Ho voluto fare il salto e passare a visual basic 2008 che utilizza la tecnologia .Net. Ho guardato tanti tutorial in giro ma ognuno ha un modo diverso e tanti a volte neanche funzionano.
Volevo semplicemente sapere com'è il comando da dare per interrogare il mio database (ACCESS 2007) con una stringa sql e mettere il risultato dentro una textbox..
Tanto x capirsi Textbox1.text = ?????
Grazie

P.s. La fase di connessione al db l'ho già fatta

Dim PercorsoDB As String = "C:\Users\Alessio\Documents\esami.accdb"
Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & PercorsoDB
Dim Cn As New OleDbConnection(ConnString)

deviato
11-03-2010, 15:46
Ho risolto.. :D :D :D
Vi posto la parte di codice così che se avete migliorie da consigliarmi possiate farlo o se semplicemente vi siete trovati nella mia stessa situazione..

Dim PercorsoDB As String = "C:\percorso\esami.accdb"
Dim ConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & PercorsoDB
Dim Cn As New OleDbConnection(ConnString)
Dim Ds As DataSet()
Dim cmd As OleDbCommand
Dim Dr As OleDbDataReader

Cn.Open()
cmd = New OleDbCommand("SELECT DOMANDA,A,B,C,D FROM esami")
Dr = cmd.ExecuteReader
Dr.Read()
TextBox1.Text = Dr(1)
TextBox2.Text = Dr(2)
TextBox3.Text = Dr(3)
TextBox4.Text = Dr(4)
TextBox5.Text = Dr(0)
Dr.Close()
Cn.Close()

Ogni volta che si lancia Dr.Read() legge il record successivo.

MarcoGG
12-03-2010, 11:12
Ho guardato tanti tutorial in giro ma ognuno ha un modo diverso e tanti a volte neanche funzionano.


E questo è un classico. :D



Dim PercorsoDB As String = "C:\percorso\esami.accdb"
Dim ConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & PercorsoDB
Dim Cn As New OleDbConnection(ConnString)
Dim Ds As DataSet()
Dim cmd As OleDbCommand
Dim Dr As OleDbDataReader

Cn.Open()
cmd = New OleDbCommand("SELECT DOMANDA,A,B,C,D FROM esami")
Dr = cmd.ExecuteReader
Dr.Read()
TextBox1.Text = Dr(1)
TextBox2.Text = Dr(2)
TextBox3.Text = Dr(3)
TextBox4.Text = Dr(4)
TextBox5.Text = Dr(0)
Dr.Close()
Cn.Close()

Ogni volta che si lancia Dr.Read() legge il record successivo.

E' una tecnica un po' strana.
A parte il fatto del DataSet Ds, che crei e, almeno nel codice postato, poi non usi mai, non ho ben chiaro lo scopo che volevi raggiungere

deviato
14-03-2010, 11:30
Beh hai ragione il dataset non l'ho usato semplicemente perchè faceva parte di un tentativo precedente.. ho dimenticato di eliminare la dichiarazione.
Semplicemente volevo leggere un record del database e poi volevo inserirlo in alcuni textbox.. Comunque se hai soluzioni migliori sono tutto orecchie.. questa è stata una soluzione che con qualche accortezza sono riuscito a far funzionare.. sicuramente sarà una soluzione contadina.. eheheh :D

MarcoGG
14-03-2010, 12:29
Beh hai ragione il dataset non l'ho usato semplicemente perchè faceva parte di un tentativo precedente.. ho dimenticato di eliminare la dichiarazione.
Semplicemente volevo leggere un record del database e poi volevo inserirlo in alcuni textbox.. Comunque se hai soluzioni migliori sono tutto orecchie.. questa è stata una soluzione che con qualche accortezza sono riuscito a far funzionare.. sicuramente sarà una soluzione contadina.. eheheh :D

Se desideravi prelevare selettivamente un record per volta, magari avendo anche la possibilità di accedervi in modalità random ( trattandosi di un quiz... ) forse il DataSet era meglio usarlo, considerando anche il fatto che in Access non è possibile fare una Select diretta per RowNum.
In poche parole, carichi la tabella delle domande in un DataSet, e poi accedi alle singole Rows del DataSet stesso passando l'indice di Row :

DataSet.Tables(index As Integer).Rows(index As Integer)

Oltretutto questo è preferibile ad avere un DataReader che fa la Select su un ID numerico direttamente da DB, in quanto in caso di continue aggiunte e rimozioni di domande dalla tabella, se non si procede opportunamente allo shifting dei record o al rimpiazzo degli ID mancanti, si incorre in inevitabili errori. Sicuramente nell'insieme Rows di un DataSet, invece non ci saranno mai "buchi" nella numerazione progressiva degli indici di riga. ;)

deviato
15-03-2010, 11:08
Funziona! Grazie per l'aiuto! ormai ti sfrutto fino alla fine eheh :D Se io avessi un database in uno spazio internet ci sarebbe la possibilità di far interagire il mio programma con quest'ultimo invece di usare un database in locale?

ilboso
15-03-2010, 11:51
Ho risolto.. :D :D :D
Vi posto la parte di codice così che se avete migliorie da consigliarmi possiate farlo o se semplicemente vi siete trovati nella mia stessa situazione..

Dim PercorsoDB As String = "C:\percorso\esami.accdb"
Dim ConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & PercorsoDB
Dim Cn As New OleDbConnection(ConnString)
Dim Ds As DataSet()
Dim cmd As OleDbCommand
Dim Dr As OleDbDataReader

Cn.Open()
cmd = New OleDbCommand("SELECT DOMANDA,A,B,C,D FROM esami")
Dr = cmd.ExecuteReader
Dr.Read()
TextBox1.Text = Dr(1)
TextBox2.Text = Dr(2)
TextBox3.Text = Dr(3)
TextBox4.Text = Dr(4)
TextBox5.Text = Dr(0)
Dr.Close()
Cn.Close()

Ogni volta che si lancia Dr.Read() legge il record successivo.


un paio di consigli:
- fai un test sul metodo "dr.read", cosi' da poter gestire il caso in cui non trovi i dati.
- per leggere il field del datareader, puoi anche usare il nome del campo, oltre che il suo indice
:)

Dim PercorsoDB As String = "C:\percorso\esami.accdb"
Dim ConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & PercorsoDB
Dim Cn As New OleDbConnection(ConnString)
Dim Ds As DataSet()
Dim cmd As OleDbCommand
Dim Dr As OleDbDataReader

Cn.Open()
cmd = New OleDbCommand("SELECT DOMANDA,A,B,C,D FROM esami")
Dr = cmd.ExecuteReader
if Dr.Read() then
TextBox1.Text = Dr("A")
TextBox2.Text = Dr("B")
TextBox3.Text = Dr("C")
TextBox4.Text = Dr("D")
TextBox5.Text = Dr("DOMANDA")
else
' dati non trovati...
end if
Dr.Close()
Cn.Close()

MarcoGG
15-03-2010, 18:11
Funziona! Grazie per l'aiuto! ormai ti sfrutto fino alla fine eheh :D Se io avessi un database in uno spazio internet ci sarebbe la possibilità di far interagire il mio programma con quest'ultimo invece di usare un database in locale?

Tutto sta a definire meglio il concetto di "spazio internet".
La risposta è : dipende...
Se ad esempio vuoi mantenere il tuo DB Access, che magari sta su FTP, ti rimando qui :
http://www.hwupgrade.it/forum/showthread.php?t=2002757
E comunque, per quanto ne so io, la risposta è No.

andrea.chiarentin
16-11-2010, 18:32
Scusate io ho un problema riguardante l'aggiornamento del DB dopo aver cancellato una riga dalla Table. In pratica il metodo update del dataadapter non fa nulla! Voi sapreste suggerirmi una possibile causa?
GRaize