DataTable Compute和Select方法给出错误的结果

时间:2013-08-17 15:40:28

标签: c# .net datatable system.data

我正在尝试在DataTable列上执行条件SUM。下面的代码没有给我正确的结果。

var d = Convert.ToDouble(myDataTable.Compute("SUM(qty_o)", "itemmaster1_id=4636 AND batch=15789")) // returns 0

myDataTable.Select("itemmaster1_id=4636 AND batch=15789") // return 0 rows

'myDataTable'有一条满足过滤条件'itemmaster1_id = 4636 AND batch = 15789'的记录,我可以在DataTable Visualizer中调试时看到它。

DataTable绑定到DataViewGrid,用于dataentry。

需要帮助。

[编辑]我做了一些进一步的调试和研究。分享细节。 DataTable中有3行。 当我运行myDataTable.Select()时,我得到3行。当我调用.Compute来对没有过滤器表达式的列值求和时,它会给出正确的结果。 但是当我尝试过滤(。选择)第3行时,我得到0行。如果我尝试过滤前两行,它们的效果非常好。顺便提一下,第三行正在DataGridView中输入。所以可能是有问题的数据行(第3行)没有提交或者什么。但是,我正在做所有必要的事情来持久化/将数据提交到数据源/数据表中,这通过.Select()调用和.Compute(“SUM(qty_o)”,null)调用来证明,返回正确的结果。我很困惑。

我也碰巧看到这个开放的错误 - http://connect.microsoft.com/VisualStudio/feedback/details/477331/filter-expression-in-datatable-compute-datatable-select-failed以及此问题 - http://support.microsoft.com/kb/891742/en-us。我在祈祷这不是.NET 4.0的问题。

[编辑22/2013年8月]仍在努力获得一个体面的解决方案。请帮忙。

[编辑16/2014年7月]再次遇到这个问题。下面的Datatable Compute方法给出了错误的答案。

double d = Convert.ToDouble(this.DataSourceAsDataTable.Compute("SUM(amount)", "jobtype=1"));

虽然下面的LINQ查询可以完美地给出正确的答案。

double n = this.DataSourceAsDataTable
                .AsEnumerable()
                .Where(r => ((r["jobtype"] != DBNull.Value) ? Convert.ToInt32(r["jobtype"]) : 0) == 1)
                .Sum(r => (r["amount"] != DBNull.Value) ? Convert.ToDouble(r["amount"]) : 0);

1 个答案:

答案 0 :(得分:0)

在上面添加以下代码行后,问题得到修复.Compute。

(this.DataSource as BindingSource).EndEdit();

显然,网格单元格中的数据(此处为jobtype列)未提交给基础数据源。 EndEdit做了这个伎俩。