2013-03-12 80 views
-1

我看到这样的代码:检查存在ExecuteScalar结果的最有效方法是什么?

object objvalid = cmd.ExecuteScalar(); 
//made it this far - must not have thrown an exception 
retVal = true; 

...但我想其中的一个可能会更好:

object objvalid = cmd.ExecuteScalar(); 
retVal = (null != objvalid); 

...

Int32 anybodyThere = (Int32) cmd.ExecuteScalar(); 
retVal = anybodyThere > 0; 
+1

首先定义'检查存在'的ExecuteScalar。你在用什么sql,你选择了哪个值?你想检查什么?它返回一个数值(例如来自'COUNT'),你想知道它是否大于零,只需检查它。那么最后一种方法很好。如果它可以返回'null',则第二种方法更合适。 – 2013-03-12 23:13:36

+0

我的意思是,它会返回一个值吗?此代码来自“IsValidField()”方法,该方法具有此SQL:string.Format(“SELECT {0} FROM {1}”,fieldName,tableName); – 2013-03-12 23:14:49

+0

@ClayShannon所以你想有效地检查一个表是否存在一列? – 2013-03-12 23:21:55

回答

1

我想你回答你自己的问题。你不能得到比这

object objvalid = cmd.ExecuteScalar(); 
retVal = (null != objvalid); 

但是要好得多,从您的评论,好像你真正想要的是要知道,如果一个列名在表中存在。为此,我建议你考虑使用DbDataAdapter.FillSchemaDbConnection.GetSchema。这两个选项都允许您针对所有列执行针对数据库的单个查询,而不是针对每列重新查询数据库。

+0

这种方法不经常被调用 - 只是为了查看用户的数据库副本是否在蓝色月亮中有一次新添加的列(它不是一遍又一遍地被调用)。 – 2013-03-12 23:48:48

+0

@ClayShannon不够公平。 :) – 2013-03-12 23:54:34

1

首先,您的方法在效率方面不会产生任何(可测量的)差异,在这种情况下,这只是无关紧要的。

你想检查什么?

  • 如果它可以返回null并且您想知道该问题,请检查该问题。那么你的第二个答案是最好的。
  • 如果查询返回一个数值(例如从COUNT),并且想知道它是否大于零,请检查它。那么最后一种方法很好。

但是,您的第一个方法并不是良好的做法,don't rely on exceptions在您的正常流量控制。

相关问题