SQLDataReader以错误的顺序返回列

时间:2014-10-29 14:03:17

标签: vb.net sql-server-2008

我有一个在VB.Net中构建数据表的函数

 Public Function GetDataTableFromSqlDataReader(ByVal dr As SqlDataReader) As DataTable

    Dim dtSchema As DataTable = dr.GetSchemaTable()
    Dim dt As New DataTable
    Dim listCols As New ArrayList

    If Not dtSchema Is Nothing Then
        For Each drow As DataRow In dtSchema.Rows
            Dim columnName As String = System.Convert.ToString(drow("ColumnName"))
            Dim column As New DataColumn(columnName, DirectCast(drow("DataType"), Type))
            column.Unique = CBool(drow("IsUnique"))
            column.AllowDBNull = CBool(drow("AllowDBNull"))
            column.AutoIncrement = CBool(drow("IsAutoIncrement"))
            listCols.Add(column)
            dt.Columns.Add(column)
        Next
    End If

    While dr.Read()
        Dim dataRow As DataRow = dt.NewRow()
        For i As Integer = 0 To listCols.Count - 1
            dataRow(DirectCast(listCols(i), DataColumn)) = dr(i)
        Next
        dt.Rows.Add(dataRow)
    End While

    Return dt

End Function

我正在返回一组包含列(UserName,TeamID,10/1/2014,10/2/2014,..... 10/29/2014)和大约15行数据的数据。

当数据读取器构建数据表并添加列,而不是按照上面的顺序添加时,它们将成为UserName,TeamID,10/14 / 2014,10 / 8 / 2014,10 //20 / 2014。 ..没有明显的模式。

我已经验证了SQL数据集是正确的,并且在构建数据表时发生了问题。

关于为什么会发生这种情况的任何想法,或者我应该看到的其他什么?此代码在所有其他情况下都可以正常工作,但有一次它没有以正确的顺序添加列。


编辑:

如果它有所不同,我使用的SQL就是使用用户名,teamid,项目数和日期并将它们放入临时表中。我是他们通过旋转数据来获取名单/队友列表以及单行中每天的计数。 #P只是日期列表,#M保存返回的数据。

 insert into #P(PV)
    select DISTINCT ReportDate 
    FROM #M;

    select @Pivot = coalesce(@Pivot+',','')+'['+PV+']'from #P;
    SET @SQL = 'select * from (select UserName,TeamID,ReportDate,PropertyValue from #M) StdP PIVOT (SUM(PropertyValue) FOR ReportDate IN ('+@Pivot+')) as PVT order by TeamID, UserName'
        EXEC(@SQL)

这是我的SQL查询返回的顺序:

Result set from SSMS

这是VB.Net datareader给我的顺序..

Order returned by VB.Net code

1 个答案:

答案 0 :(得分:0)

为什么不使用DataTable.Load?

Public Function GetDataTableFromSqlDataReader(ByVal dr As SqlDataReader) As DataTable
  Dim dt As New DataTable
  dt.Load(dr)
  return dt
End Function