Originariamente inviato da Trinità
Resta comunque il fatto (curioso) che facendo il controllo sul datareader viene "bruciato" un record....
mi piacerebbe sapere se ad esempio nella 1.1 del framew. il problema sia stato risolto... è assurdo che controllando non posso più disporre della situazione precedente al controllo ...
Carissimo Trinità: non sono molto diplomatico e ti chiedo scusa, ma, il problema non è nel DataReader, che funziona benissimo, ma nel modo sbagliato di usarlo.
Vediamo un poco. Se vogliamo più prestazioni possiamo usare il DataSet col DataAdapter, ma per popolare un DropDown è troppo pesante (secondo me è come affittare una gru per automotrice per sollevare una carriola! )
Per snellire l'accesso ai dati è stato creato un nuovo oggetto, il DataReader che mantiene in memoria, non tutta la tabella, ma un record per volta. Questo oggetto non ci dice se la tabella è piena o vuota, perché non è stato creato per questo. L'unico modo di usarlo è fare una scansione della tabella con un ciclo:
Do While DataReader.Read()
'leggo i campi che interessano
Loop
Se voglio sapere se la tabella è piena o vuota, l'unico modo è sapere se il programma entra dentro il ciclo. Un modo è quello di creare una variabile NumeroRecord inizializzata a zero e aggiornarla dentro il ciclo.
All'uscita basta controllare se il valore è zero o superiore.
Poi un'altra considerazione. Il controllo DropDown viene popolato di solito con l'istruzione DataBind. Non so come funzioni, ma penso che sia un metodo che, passandogli il DataReader come DataSource, il DataTextField, il DataValueField, faccia una scansione del DataReader, e popoli di DropDown nella scansione. Se tu prima fai DataReader.Read, questa funzione non può saperlo perchè presume che il DataReader punti al record -1.
Va bene, sono un cane a spiegare: ti mando un po' di codice per riempire il DropDown, vedi se ti può servire:
codice:
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
BindData()
End Sub
Private Function ConnectionString() As String
Return Application("connessione_access_prova").ToString
End Function
Private Function Query() As String
Return "SELECT ID, TESTO FROM CAMPI WHERE 1=1"
End Function
Private Sub BindData()
Dim Connection As New OleDbConnection(ConnectionString())
Connection.Open()
Dim Comand As New OleDbCommand(Query(), Connection)
Dim DataReader As OleDbDataReader = Comand.ExecuteReader(CommandBehavior.CloseConnection)
Dim NumeroRecord% = 0
Do While DataReader.Read()
NumeroRecord += 1
Me.DropDownList1.Items.Add(New ListItem(DataReader.GetString(1), DataReader.GetInt32(0).ToString))
Loop
DataReader.Close()
Connection.Close()
Me.DropDownList1.Visible = (NumeroRecord <> 0)
End Sub