http://bugzilla.novell.com/show_bug.cgi?id=539623
Summary: DataView.ToTable() does not contain properly sorted
rows
Classification: Mono
Product: Mono: Runtime
Version: 2.4.x
Platform: All
OS/Version: All
Status: NEW
Severity: Major
Priority: P5 - None
Component: misc
AssignedTo: [email protected]
ReportedBy: [email protected]
QAContact: [email protected]
Found By: ---
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.10)
Gecko/2009042700 SUSE/3.0.10-1.1 Firefox/3.0.10
When attempting to sort the contents of a DataTable with a DataView, then
returning the results of the DataView with the DataView.ToTable() method, the
contents of the returned table are not actually sorted correctly.
In the attached example, we assemble a DataTable with several distinct rows,
then apply a various Sort operations to the table's DefaultView. In each case,
when the contents of the DataTable returned by the DataView's ToTable() method
are printed, the contents are improperly sorted. If instead the contents of
the DataView are accessed by integer index (also in the example program), the
rows are properly sorted. This appears to be a bug in the ToTable() method.
The scope of our test only considered a sorted DataView, but other operations
on the DataView (such as filtering) would presumptively result in similar
behavior.
Reproducible: Always
Steps to Reproduce:
public class DataViewTest
{
public static void Main (string[] arg)
{
System.Data.DataTable dataTable = new System.Data.DataTable();
dataTable.Columns.Add("Score", typeof(decimal)); // string
columnName, System.Type dataType
dataTable.Columns.Add("Date", typeof(System.DateTime)); // string
columnName, System.Type dataType
object[][] dataRows = new object[][] { new object[] { (decimal)0, new
System.DateTime(2008, 12, 31, 0, 0, 0) },
new object[] { (decimal)6, new
System.DateTime(2008, 12, 30, 0, 0, 0) },
new object[] { (decimal)0, new
System.DateTime(2008, 12, 30, 0, 0, 0) },
new object[] { (decimal)5, new
System.DateTime(2008, 12, 30, 0, 0, 0) },
new object[] { (decimal)1, new
System.DateTime(2008, 12, 30, 0, 0, 0) },
new object[] { (decimal)4, new
System.DateTime(2008, 12, 30, 0, 0, 0) },
new object[] { (decimal)2, new
System.DateTime(2008, 12, 30, 0, 0, 0) },
new object[] { (decimal)3, new
System.DateTime(2008, 12, 30, 0, 0, 0) },
new object[] { (decimal)0, new
System.DateTime(2008, 12, 30, 0, 0, 1) },
new object[] { (decimal)3, new
System.DateTime(2008, 12, 31, 0, 0, 0) } };
for (int i=0; i<dataRows.Length; i++) {
dataTable.Rows.Add( dataRows[i][0], dataRows[i][1] );
}
System.Console.WriteLine("Pre-Sort:");
PrintDataTable(dataTable);
System.Data.DataView sortedView = dataTable.DefaultView;
sortedView.Sort = "Date ASC";
System.Console.WriteLine("\n\nPost-Sort: (criteria = {0}) --
DataView.ToTable()", sortedView.Sort);
PrintDataTable(sortedView.ToTable());
System.Console.WriteLine("Post-Sort: (criteria = {0}) -- DataView
records", sortedView.Sort);
for (int i=0; i<sortedView.Count; i++) {
System.Console.WriteLine(" {0}, {1}", sortedView[i][0],
sortedView[i][1]);
}
sortedView.Sort = "Date DESC";
System.Console.WriteLine("\n\nPost-Sort: (criteria = {0}) --
DataView.ToTable()", sortedView.Sort);
PrintDataTable(sortedView.ToTable());
System.Console.WriteLine("Post-Sort: (criteria = {0}) -- DataView
records", sortedView.Sort);
for (int i=0; i<sortedView.Count; i++) {
System.Console.WriteLine(" {0}, {1}", sortedView[i][0],
sortedView[i][1]);
}
sortedView.Sort = "Date DESC, Score DESC";
System.Console.WriteLine("\n\nPost-Sort: (criteria = {0}) --
DataView.ToTable()", sortedView.Sort);
PrintDataTable(sortedView.ToTable());
System.Console.WriteLine("Post-Sort: (criteria = {0}) -- DataView
records", sortedView.Sort);
for (int i=0; i<sortedView.Count; i++) {
System.Console.WriteLine(" {0}, {1}", sortedView[i][0],
sortedView[i][1]);
}
}
public static void PrintDataTable ( System.Data.DataTable dataTable )
{
for (int i=0; i<dataTable.Columns.Count; i++) {
System.Console.Write("{0}{1}", ((i==0) ? " " : ", "),
dataTable.Columns[i].ColumnName);
}
System.Console.WriteLine("");
for (int j=0; j<dataTable.Rows.Count; j++) {
for (int i=0; i<dataTable.Columns.Count; i++) {
System.Console.Write("{0}{1}", ((i==0) ? " " : ", "),
dataTable.Rows[j][dataTable.Columns[i].ColumnName]);
}
System.Console.WriteLine("");
}
}
}
Actual Results:
PROMPT> mono DataViewTest.exe
Pre-Sort:
Score, Date
0, 12/31/2008 12:00:00 AM
6, 12/30/2008 12:00:00 AM
0, 12/30/2008 12:00:00 AM
5, 12/30/2008 12:00:00 AM
1, 12/30/2008 12:00:00 AM
4, 12/30/2008 12:00:00 AM
2, 12/30/2008 12:00:00 AM
3, 12/30/2008 12:00:00 AM
0, 12/30/2008 12:00:01 AM
3, 12/31/2008 12:00:00 AM
Post-Sort: (criteria = Date ASC) -- DataView.ToTable()
Score, Date
0, 12/30/2008 12:00:00 AM
0, 12/30/2008 12:00:01 AM
0, 12/31/2008 12:00:00 AM
1, 12/30/2008 12:00:00 AM
2, 12/30/2008 12:00:00 AM
3, 12/30/2008 12:00:00 AM
3, 12/31/2008 12:00:00 AM
4, 12/30/2008 12:00:00 AM
5, 12/30/2008 12:00:00 AM
6, 12/30/2008 12:00:00 AM
Post-Sort: (criteria = Date ASC) -- DataView records
6, 12/30/2008 12:00:00 AM
0, 12/30/2008 12:00:00 AM
5, 12/30/2008 12:00:00 AM
1, 12/30/2008 12:00:00 AM
4, 12/30/2008 12:00:00 AM
2, 12/30/2008 12:00:00 AM
3, 12/30/2008 12:00:00 AM
0, 12/30/2008 12:00:01 AM
0, 12/31/2008 12:00:00 AM
3, 12/31/2008 12:00:00 AM
Post-Sort: (criteria = Date DESC) -- DataView.ToTable()
Score, Date
0, 12/30/2008 12:00:00 AM
0, 12/30/2008 12:00:01 AM
0, 12/31/2008 12:00:00 AM
1, 12/30/2008 12:00:00 AM
2, 12/30/2008 12:00:00 AM
3, 12/30/2008 12:00:00 AM
3, 12/31/2008 12:00:00 AM
4, 12/30/2008 12:00:00 AM
5, 12/30/2008 12:00:00 AM
6, 12/30/2008 12:00:00 AM
Post-Sort: (criteria = Date DESC) -- DataView records
0, 12/31/2008 12:00:00 AM
3, 12/31/2008 12:00:00 AM
0, 12/30/2008 12:00:01 AM
6, 12/30/2008 12:00:00 AM
0, 12/30/2008 12:00:00 AM
5, 12/30/2008 12:00:00 AM
1, 12/30/2008 12:00:00 AM
4, 12/30/2008 12:00:00 AM
2, 12/30/2008 12:00:00 AM
3, 12/30/2008 12:00:00 AM
Post-Sort: (criteria = Date DESC, Score DESC) -- DataView.ToTable()
Score, Date
6, 12/30/2008 12:00:00 AM
5, 12/30/2008 12:00:00 AM
4, 12/30/2008 12:00:00 AM
3, 12/31/2008 12:00:00 AM
3, 12/30/2008 12:00:00 AM
2, 12/30/2008 12:00:00 AM
1, 12/30/2008 12:00:00 AM
0, 12/31/2008 12:00:00 AM
0, 12/30/2008 12:00:01 AM
0, 12/30/2008 12:00:00 AM
Post-Sort: (criteria = Date DESC, Score DESC) -- DataView records
3, 12/31/2008 12:00:00 AM
0, 12/31/2008 12:00:00 AM
0, 12/30/2008 12:00:01 AM
6, 12/30/2008 12:00:00 AM
5, 12/30/2008 12:00:00 AM
4, 12/30/2008 12:00:00 AM
3, 12/30/2008 12:00:00 AM
2, 12/30/2008 12:00:00 AM
1, 12/30/2008 12:00:00 AM
0, 12/30/2008 12:00:00 AM
--
Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.
_______________________________________________
mono-bugs maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-bugs