我有一个在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查询返回的顺序:
这是VB.Net datareader给我的顺序..
答案 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