Convertire un DataReader in un DataTable, e ottenere il Mapping direttamente in un oggetto DataTable senza l?oggetto DataSet

Un titolo un po? lungo :-)

Per varie che siano le cause capita di convertire un oggetto DataReader in un DataTable per fare cò dobbiamo ereditare una classe DbDataAdapter che implementa un set di funzioni per fornire una tipizzazione forte, inoltre eredita maggior parte delle funzionalità necessarie per una completa implementazione di DataAdapter.

Veniamo al codice.

 

Imports System

Imports System.Data

Imports System.Data.Common

 

Namespace DataUtil

    Public Class DataReaderAdapter

        Inherits DbDataAdapter

        Protected Overrides Function CreateRowUpdatedEvent(ByVal dataRow As System.Data.DataRow, ByVal command As System.Data.IDbCommand, ByVal statementType As System.Data.StatementType, ByVal tableMapping As System.Data.Common.DataTableMapping) As System.Data.Common.RowUpdatedEventArgs

            Return Nothing

        End Function

        Protected Overrides Function CreateRowUpdatingEvent(ByVal dataRow As System.Data.DataRow, ByVal command As System.Data.IDbCommand, ByVal statementType As System.Data.StatementType, ByVal tableMapping As System.Data.Common.DataTableMapping) As System.Data.Common.RowUpdatingEventArgs

            Return Nothing

        End Function

        Public Function FillFromReader(ByVal DataTable As DataTable, ByVal dataReader As IDataReader) As Int32

            Return Me.Fill(DataTable, dataReader)

        End Function

        Public Function FillSchemaTable(ByVal DataTable As DataTable, ByVal Tipo As SchemaType, ByVal Command As IDbCommand, ByVal Behavior As CommandBehavior) As DataTable

            Return Me.FillSchema(DataTable, Tipo, Command, Behavior)

        End Function

        Protected Overrides Sub OnRowUpdated(ByVal value As System.Data.Common.RowUpdatedEventArgs)

        End Sub

        Protected Overrides Sub OnRowUpdating(ByVal value As System.Data.Common.RowUpdatingEventArgs)

        End Sub

    End Class

End Namespace

 

I metodo che ci servono sono i classici ma con più funzionalità Fill e FillSchema.

L?esempio console per provare:

Imports System.Data

Imports System.Data.SqlClient

Module Module1

 

    Sub Main()

        Console.WriteLine("Inizio connessione. Premi Invio per continuare")

        Console.ReadLine()

        Dim da As SqlDataAdapter

        Dim cn As SqlConnection = New SqlConnection("Server=(local);database=Northwind;user id=sa;password=fabio;")

        Dim sql As String = "Select * from Employees"

        Dim cmd As New SqlCommand(sql, cn)

        cn.Open()

 

        Dim dra As DataUtil.DataReaderAdapter = New DataUtil.DataReaderAdapter

 

        Dim DtX As DataTable = dra.FillSchemaTable(New DataTable("mia"), SchemaType.Source, cmd, CommandBehavior.Default)

 

        Dim dr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)

        Dim dt As DataTable = New DataTable

        dra.FillFromReader(dt, dr)

        dr.Close()

        Dim i As Int32

        For i = 0 To dt.Rows.Count - 1

            Console.WriteLine(dt.Rows(i)(1).ToString())

        Next

        Console.WriteLine("")

        Console.WriteLine("Visualizzazione del Mapping. Premere invio.")

        Console.ReadLine()

 

        Dim Colonna As DataColumn

        For Each Colonna In DtX.Columns

            Console.WriteLine("Caption {0} AllowDBNull {1} AutoIncrement {2} AutoIncrementSeed {3} AutoIncrementStep {4} MaxLength {5} DataType {6}", Colonna.Caption, Colonna.AllowDBNull, Colonna.AutoIncrement, Colonna.AutoIncrementSeed, Colonna.AutoIncrementStep, Colonna.MaxLength, Colonna.DataType)

        Next

 

        Console.ReadLine()

    End Sub

 

End Module

 

ciao

Nella stessa categoria
    Nessuna risorsa collegata

    Commenti

    Aggiungi un nuovo commento »»»
    Per inserire un commento, devi registrarti alla nostra community.

    © 1998-2008 - dracula - Il blog di Fabio "dracula" Civerchia