Ontem recebi um email de um amigo que me pedia se existia alguma forma de pegar o conteúdo de um DataReader e colocar em um DataSet.
Nunca tinha feito isso, e tinha certeza que é possível. Fiquei com tanta curiosidade que decidi colocar a “mão na massa” e tentar fazer essa funcionalidade.
Inicialmente sei que era possível percorrer os registros retornados. A única dúvida que estava um pouco preocupado, foi em como resgatar as colunas (tanto seus valores, quantos seus nomes). Pois bem, fui o Help e procurei pelos membros do DataReader e encontrei a propriedade FieldCount, qual retorna o número de colunas da linha em questão. Com isso, “matei” um problema, mas ainda faltava saber como resgatar o nome da coluna. Da mesma forma, fui ao Help e encontrei o método GetName, que dado um índice, ele retorna o nome desta coluna.
Depois disso, ficou simples, basta apenas percorrer os registros (linhas) do DataReader, e a cada linha, percorrer as colunas da mesma. O código abaixo, ilustra o processo:
Dim conn As New SqlConnection(“ConnectionString”)
Dim cmd As New SqlCommand(“SELECT * FROM Categories”, conn)
Dim dr As SqlDataReader
Dim i As Integer = 0
Dim dRow As DataRow
Dim num2 As Integer
Dim ds As DataSet = New DataSet
Try
conn.Open()
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
If dr.HasRows() Then
ds.Tables.Add(“NomeTabela”)
While dr.Read
dRow = ds.Tables(0).NewRow
num2 = 0
Do While (num2 < dr.FieldCount)
If (i = 0) Then
ds.Tables(0).Columns.Add(dr.GetName(num2))
End If
dRow(num2) = dr.GetValue(num2)
num2 = (num2 + 1)
Loop
i = (i + 1)
ds.Tables(0).Rows.Add(dRow)
End While
dr.Close()
End If
Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
If Not (dr Is Nothing) Then
dr.Close()
End If
End Try
Mas uma coisa que fique bem claro: isso não quer dizer que gosto de DataSets 😉