2014-10-29 58 views
1

返回列我有一个建立在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查询返回的顺序:

Result set from SSMS

这是为了使VB.Net DataReader的给我..

Order returned by VB.Net code

+1

为什么不直接使用[DataTable.Load()](http://msdn.microsoft.com/zh-cn/library/7x8ccbsb.aspx)? – 2014-10-29 14:08:19

+0

我没有写这个,我替换的开发者做了,并且它用在了我们所有的应用程序中。直到这个事件,它的工作很好。人们不希望改变已经建立的东西。否则,为了使代码更高效,我想做出无数的改变。 – Bigdaddyduergar 2014-10-29 14:12:50

+1

不知道为什么订单不一样,但你可以尝试改变你的foreach到这个吗?对于dtSchema.AsEnumerable()中的每个卓尔精灵来说,OrderBy(Function(x)x(“ColumnOrdinal”))' – Steve 2014-10-29 14:36:26

回答

0

为什么不只是使用DataTable.Load?

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

我只是试着用这个作为测试,并且它以我原来的代码的相同顺序返回它们。所以这也不起作用。 – Bigdaddyduergar 2014-10-29 14:19:17

+0

你在你的问题中提到了一个sql数据集,但代码显示了datareader。你能澄清你在哪里看到数据的顺序:UserName,TeamID,10/1/2014,10/2/2014? – basher 2014-10-29 14:26:46

+0

当我在SSMS中运行查询时,它以正确的顺序显示结果集(我可能在这里使用错误的术语,如果是的话,我道歉)。 – Bigdaddyduergar 2014-10-29 14:28:38