>I have this weird situation that I just found and I would like to know if some of you knows something about it.
>
>In my data class, since five years, I have the ability to define a sort field on a dataview. Then, I can scan the dataset rows and they appear in the order of the sort. This has worked well so far but they all have one thing in common. Wherever I was using that, so far, in several applications, it was always on a dataset that I created all the rows manually. Those dataset were not created from a SQL select. So, doing this:
>
>
> Public oDataSet As DataSet = New DataSet
> Private oDataView As DataView = New DataView
>
> oDataSet.Tables.Add("Temp")
>
> oDataSet.Tables(0).Columns.Add("Extension", GetType(System.String))
> oDataSet.Tables(0).Columns.Add("LastUpdate", GetType(System.DateTime))
> oDataSet.Tables(0).Columns.Add("Name", GetType(System.String))
> oDataSet.Tables(0).Columns.Add("Size", GetType(System.Int32))
> oDataSet.Tables(0).Columns.Add("JustName", GetType(System.String))
> oDataSet.Tables(0).Columns.Add("CreationTime", GetType(System.DateTime))
>
> ' Create the view
> oDataView = oDataSet.Tables(0).DefaultView
>
> ' Sort the dataset into the primary key
> oData.oDataView.Sort = "AI"
>
> ' For each record
> For lnCounter = 0 To oData.nCount - 1
> loRow = oData.oRows(lnCounter)
>
> Next
>
>
>...is working ok.
>
>But, if I create the dataset from a SQL select such as:
>
>
> Using loSQLConnection As New SqlConnection(oApp.aConnection(nConnectionString, 1))
> oCommand.Connection = loSQLConnection
> oDataAdapter.Fill(oDataSet)
> End Using
>
> ' Adjust to our default name
> oDataSet.Tables("Table").TableName = "Temp"
>
> ' Record count
> nCount = oDataSet.Tables("Temp").Rows.Count
>
> oDataView = New DataView
>
> ' If we have no record
> If nCount = 0 Then
> oRows = Nothing
> Else
> oDataView = oDataSet.Tables("Temp").DefaultView
> oRows = oDataSet.Tables("Temp").Rows()
> End If
>
> ' Sort the dataset into the primary key
> oData.oDataView.Sort = "AI"
>
> ' For each record
> For lnCounter = 0 To oData.nCount - 1
> loRow = oData.oRows(lnCounter)
>
> Next
>
>
>...this will not work. I would have to do this in order for the sort to work:
>
>
> For Each loRowView In oData.oDataView
> Next
>
>
>Anyone knows why I am forced to use the oData.oDataView approach to have my For Next to scan the records in the sort order when this is build from a SQL select and can obtain the sorting directly from the oDataSet.oRows when I create the dataset manually?
If oData is the table (code doesn't show what it is) then in the first instance you are looping thru that (unsorted) and in the second you are (correctly) using the DataView.
IAC it might be better to use the DataView constructor to specify the sort order (
http://msdn.microsoft.com/en-us/library/8sd1cd0a.aspx) rather than using the defaultview reference -
"Creating a DataView without specifying sort or filter criteria and then setting the Sort, RowFilter, or RowStateFilter properties later causes the index to be built at least twice: once when the DataView is created, and again when any of the sort or filter properties are modified." (
http://msdn.microsoft.com/en-us/library/hy5b8exc.aspx)