DataReader para DataSet

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 😉

CallBacks em ServerControls (ASP.NET 2.0)

O ASP.NET 2.0 nos trará a possibilidade de utilizamos CallBacks em nossos WebForms. O que isso representa:

Há muitos momentos, em que precisamos resgatar algum valor, ou mesmo ir até a DB, buscar algum dado para comparação, validação, etc. e sempre temos que atualizar a página para recuperarmos o valor, qual muitas vezes, precisamos apenas mudar poucas coisas em seu layout, ou seja, sendo desnecessário a reconstrução de toda a página novamente (que é o que acontece atualmente com PostBacks).

Tendo este cenário, entra em cena os ServerControls que suportarão Async CallBacks. Com isso, poderemos ir até o servidor, fazermos comparações, validações, etc., sem termos que reconstruir novamente todo o WebForm.

Atualmente é possível fazer isso com a utilização de XMLHTTP, mas o problema é que temos que escrever muito código JavaScript, tanto para fazer a requisição remota, quanto para manipular os objetos da página. Veremos abaixos os dois casos (PostBacks vs. CallBacks):

PostBack
Init
Load State
Process PostBack Data
Load
PostBack Events
Save State
PreRender
Render
Unload
 
CallBack
Init
Load State
Process PostBack Data
Load
CallBack Event
Unload

Como podemos ver em CallBacks, os eventos PreRender e Render não são invocados (eventos, quais são responsáveis pela construção do HTML, que posteriormente é enviado ao browser pelo Objeto Response), pois como dito anteriormente, não é necessário passarmos por essa fase, já que os WebForms estão “prontos”.