Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net SQLDataReader以错误的顺序返回列_Vb.net_Sql Server 2008 - Fatal编程技术网

Vb.net SQLDataReader以错误的顺序返回列

Vb.net SQLDataReader以错误的顺序返回列,vb.net,sql-server-2008,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 Not

我有一个在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
我返回一组数据,其中包含列(用户名、TeamID、2014年1月10日、2014年2月10日……2014年10月29日)和大约15行数据

当数据读取器构建数据表并添加列时,它们不是按照上面的顺序,而是用户名、TeamID、2014年10月14日、2014年10月8日、2014年10月20日。。。。没有明显的图案

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

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


编辑:

如果有区别的话,我使用的SQL就是获取用户名、teamid、项目计数和日期,并将它们放入一个临时表中。我让他们旋转数据,在一行中获得姓名/团队ID列表和每天的计数#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给我的命令


为什么不直接使用DataTable.Load

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

为什么不直接使用呢?这不是我写的,是我替换的开发人员写的,我们所有的应用程序都使用它。在这件事之前,一切都很顺利。人们并不热衷于改变已经建立的东西。否则,我会对代码进行大量修改,以提高代码的效率。我不知道为什么顺序不一样,但您能尝试将foreach更改为这一个吗
对于dtSchema.AsEnumerable().OrderBy(函数(x)x(“ColumnOrdinal”))
我非常喜欢@Steve的建议,但是您也可以在
返回dt
语句之前,对数据表本身的列重新排序。。。看起来确实是个黑客,但如果你问我,可能是最安全的方式@史蒂夫:试过你的建议,第一次约会还是10/14。在这一点上,我正在考虑必须使用黑客来解决它/我只是试着用它作为测试,它返回它们的顺序与我的原始代码相同。所以这也不起作用。您在问题中提到了sql数据集,但代码显示了datareader。你能澄清一下你在哪里看到了顺序中的数据吗:用户名、团队ID、2014年1月10日、2014年2月10日?当我在SSMS中运行查询时,它以正确的顺序显示结果集(我可能在这里使用了错误的术语,如果是的话,我道歉)。我刚刚添加了两个屏幕截图,显示了SSMS给我的内容以及datareader给我的顺序。我只是把数据直接输入excel。