2012-02-23 24 views
6

Ho una domanda sulla conversione di un datareader in un datatable. Nel mio codice, ho un datareader creato in una classe e passato ad un'altra classe che voglio convertirlo in un datatable.Come convertire un datareader in datatable

Quando si esegue questa operazione, non sembra funzionare, poiché il tavolo rimane vuoto. Se faccio la conversione nella stessa funzione, funziona bene.

E 'solo quando passo il datareader a un'altra funzione che esso smette di funzionare. È perché il dr è chiuso o qualcosa del genere? Come posso superare questo problema? Qualsiasi aiuto sarebbe grande.

+0

Non si dovrebbe mai passare a 'DataReader', in quanto mancherà completamente di disporre gli oggetti o più volte i dati non saranno più lì. Puoi modificare il metodo che è in uso, quello prima di restituire il 'DataReader'? Ad esempio, puoi aggiungere una proprietà 'DataTable' a quel metodo e popolarlo prima del ritorno in modo da poter afferrare al di fuori di' classe' ... – balexandre

+1

no, mi è stato chiesto di restituire solo un datareader. la logica è che la funzione che passa il datareader può essere utilizzata altrove – jason

risposta

2

Check this out:

Public Function ExecuteQuery(ByVal s As String, ByVal condb As SqlConnection, ByVal ParamArray params() As SqlParameter) As DataTable 
     Dim dt As DataTable = Nothing 
     Using da As New System.Data.SqlClient.SqlDataAdapter(s, condb)    
      dt = New DataTable 
      If params.Length > 0 Then 
       da.SelectCommand.Parameters.AddRange(params) 
      End If 
      If da.SelectCommand.Connection.State <> ConnectionState.Open Then da.SelectCommand.Connection.Open() 
      da.Fill(dt)      
     End Using 
     Return dt 
End Function 
+0

+1, una buona @HndlCode –

+0

grazie per la risposta. c'è comunque da fare senza conoscere la connessione oi parametri? L'unica cosa che mi è passata è la datareader. grazie – jason

+0

ParamArray è opzionale, quindi non è necessario passare alcun parametro :), si prega di contrassegnare la mia anser come corretta – HndlCode

39

Usa DataTable Load() metodo.

// Given a DataReader called "reader" 
DataTable dt = new DataTable(); 
dt.Load(reader) 
Problemi correlati