Bill Jones Jr. MVP Visual Basic

Charlotte NC - MCP C# and VB.Net - Founder and President of the Enterprise Developers Guild (.Net User Group)

  Home  |   Contact  |   Syndication    |   Login
  32 Posts | 0 Stories | 53 Comments | 32 Trackbacks

News

My wife, my pastor, my company, my boss, my friends and all my user group members reserve the inalienable right to disavow anything published here. My children will just to have to get over it. The cat doesn't speak to me anyway.

Enterprise Developers Guild - Charlotte MSDN .NET User Group

Archives

Post Categories

Sunday, March 19, 2006 #

Are you still using Framework 1 or 1.1?  Are you using DNN 3?  Did you know there is a function to convert a data reader object into a dataset built into DNN 3?  Neither did I, so I wrote one.  And then I found one Dan Thayer of Logical Advantage had sent me in an email a few months ago.  Dan uses reflection, so his is pretty slick.  If you want to see Dan's solution, let me know.  I'm sure he would be happy to lend his permission for me to publish it.

 

Anyway, it was right after I discovered the second preexisting solution to the same issue that I decided to install the VB Snippet Editor (http://msdn.microsoft.com/vbasic/downloads/tools/default.aspx) so maybe I can reduce the number of times I re-invent the wheel.

 

If you are lucky enough to already be doing production work in Framework 2, all this should be unnecessary.  I’ve seen a load function in the dataset (or data table?) in 2.0 that uses the data reader as input.

 

When we implemented this function, we coded a couple of overloads making the name parameters optional.  Yes, I know we can use the optional attribute directly on the parameters, but that doesn’t play well with some of the less sophisticated CLR languages.  Look it over.  Add it to your Snippets if you like it.  Oh and yes, the VB Snippet Editor requires Framework 2 to run, but it doesn’t mind if you save J#, C# or Framework 1.x code.  The Snippet Editor is definitely a handy tool.

 

     Bill J

        ''' -----------------------------------------------------------------------------
        ''' 
        ''' Uses the dataRdr schema to create a DataTable.  Populates the new DataTable
        ''' from the dataRdr and loads it to a DataSet using the tableName provided.
        ''' 
        Public Shared Function ReaderToDataSet(ByVal dataRdr As IDataReader, _
                                             ByVal tableName As String, _
                                             ByVal datasetName As String) As DataSet
            Dim myTable As New DataTable
            Dim myDS As New DataSet
            Dim myRow As DataRow

            Try
                SetTableSchemaHelper(myTable, dataRdr)
                myTable.TableName = tableName
                myDS.Tables.Add(myTable)

                Do While dataRdr.Read
                    myRow = myTable.NewRow()
                    For i As Integer = 0 To dataRdr.FieldCount - 1
                        myRow(i) = dataRdr.GetValue(i)
                    Next
                    myTable.Rows.Add(myRow)
                Loop

                dataRdr.Close()
                Return myDS

            Catch ex As Exception
                Throw New ApplicationException("ReaderToDataSet - " & ex.Message)
            End Try

        End Function

        ''' -----------------------------------------------------------------------------
        ''' 
        ''' Helper method to add columns to a table from a schema table loaded from
        ''' a DataReader object.  Note the target table is accessed by reference.
        ''' 
        ''' -----------------------------------------------------------------------------
        Public Shared Sub SetTableSchemaHelper(ByRef dtTable As DataTable, _
                                             ByVal dataRdr As IDataReader)
            Dim mySchema As DataTable
            Dim myCol As DataColumn

            mySchema = dataRdr.GetSchemaTable

            For i As Integer = 0 To mySchema.Rows.Count - 1
                myCol = New DataColumn
                With mySchema.Rows(i)
                    myCol.ColumnName = DirectCast(.Item("ColumnName"), String)
                    myCol.AllowDBNull = DirectCast(.Item("AllowDBNull"), Boolean)
                    myCol.AutoIncrement = DirectCast(.Item("IsIdentity"), Boolean)
                    myCol.Unique = myCol.AutoIncrement
                    myCol.DataType = DirectCast(.Item("DataType"), Type)
                    If myCol.DataType Is System.Type.GetType("String") Then
                        myCol.MaxLength = DirectCast(.Item("ColumnSize"), Integer)
                    End If
                    myCol.ReadOnly = DirectCast(.Item("IsReadOnly"), Boolean)
                    If myCol.Unique = False Then
                        myCol.Unique = (myCol.DataType Is System.Type.GetType("GUID"))
                    End If
                End With
                dtTable.Columns.Add(myCol)
            Next i

        End Sub