2013-03-12 106 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在您的正常流量控制。

相關問題