2012-01-12 34 views
0

我想找到只包含数字值的那些行形式的表,所以我做了如下检查数据表中列包含数值

dtDetails.Select(" (ISNUMERIC(OriginatingTransit)=0)") 

但它抛出异常

The expression contains undefined function call ISNUMERIC(). 
+0

hmmm可能是这样的dtDetails.Select(“ISNUMERIC(OriginatingTransit)= 0”) – 2012-01-12 13:42:20

+0

是一个'System.Data.EvaluateException'异常吗?如果是这样,请参阅http://social.msdn.microsoft.com/Forums/is/adodotnetdataset/thread/d61ba2f5-c999-4fc1-aee0-e61415f439b8 – 2012-01-12 13:47:07

+1

“ISNUMERIC”几乎总是使用错误的函数 - 它回答了一个问题:我从来没有发现任何人想问(“这个文本是否可以转换成至少一种数字数据类型?”),而不是大多数人常见的问题(“该文本可以转换为X?”,其中X是*特定的*数据类型)。例如,'1d2'是'ISNUMERIC'定义的数字,就像'''一样。 – 2012-01-12 13:50:26

回答

1

你”必须在数据库级别执行该操作,或者循环遍历自己并编写一些内容来检查值是否可以被解析为数字。 Select方法不支持你想要做的事情:Expression property on MSDN, contains info about what's supported

bool IsNumeric(object o) 
{ 
    decimal result_ignored; 
    return o != null && 
    !(o is DBNull) && 
    decimal.TryParse(Convert.ToString(o), out result_ignored); 
} 

然后你就可以做这样的事情:

var filtered = dtDetails.Rows.Cast<DataRow>(). 
    Where(r => IsNumeric(r["OriginatingTransit"])); 

如果再枚举filtered,你会得到只有那些在该列中的数值。

这并不完美 - 因为Surjit Samra在the answer linked to上对上述问题的评论中提到了一些意见,'数字'的确切含义是松散的。我认为这通过使用decimal尝试解析该值来尽可能广泛地进行描述。如果您的要求更严格,您可以使用其他类型(例如intfloat)或正则表达式。

+0

我只想检查整数只可能这将工作,如果我cheng int.parse – 2012-01-12 14:01:05

+0

@PranayRana是啊'int.TryParse'也会工作 – 2012-01-12 14:01:58

+0

完成谢谢............. ..求助 – 2012-01-12 14:14:55