返回列我有一个建立在VB.NetSqlDataReader的顺序错误
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
数据表
我返回一组数据的列(函数用户名,TeamID,2014年10月1日, 10/2/2014,..... 10/29/2014)和大约15行数据。
当数据读取器构建的数据表,并添加列,而不是将它们在上面的顺序是,他们去用户名,TeamID,2014年10月14日,2014年10月8日,二零一四年十月二十日。 ...没有明显的模式。
我验证过的SQL数据集是正确的,并且在数据表上正在修建的时候是在问题发生时。
任何想法,为什么发生这种情况,还是什么其他的事情,我应该看它?此代码在所有其他情况下都可以正常工作,但是这一次不会按正确的顺序添加列。
编辑:
如果它的确与众不同,我使用的是SQL正在采取的用户名,teamid,项目数和日期,并把它们变成一个临时表。我是他们摆动数据以获得名单/ 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 ('[email protected]+')) as PVT order by TeamID, UserName'
EXEC(@SQL)
这是我的SQL查询返回的顺序:
这是为了使VB.Net DataReader的给我..
为什么不直接使用[DataTable.Load()](http://msdn.microsoft.com/zh-cn/library/7x8ccbsb.aspx)? – 2014-10-29 14:08:19
我没有写这个,我替换的开发者做了,并且它用在了我们所有的应用程序中。直到这个事件,它的工作很好。人们不希望改变已经建立的东西。否则,为了使代码更高效,我想做出无数的改变。 – Bigdaddyduergar 2014-10-29 14:12:50
不知道为什么订单不一样,但你可以尝试改变你的foreach到这个吗?对于dtSchema.AsEnumerable()中的每个卓尔精灵来说,OrderBy(Function(x)x(“ColumnOrdinal”))' – Steve 2014-10-29 14:36:26