2009-12-28 67 views
2
public static int ExecuteNonQuery(String procedure, params SqlParameter[] args) 
{ 
    if (args == null) throw new ArgumentNullException("args"); 
    else 
    return ExecuteNonQuery(procedure, new SqlParameter[] { }); 
} 

爲什麼越來越遞歸函數和調用該上述方法時拋出的StackOverflow例外。(當參數包含5個值)計算器例外

回答

3

這是因爲重載決議採相同ExecuteNonQuery方法,所以你基本上是呼喚同樣的方法一遍又一遍。

您的方法需要一個SqlParameter [](params部分只是語法糖),並且您正在使用SqlParameter []作爲第二個參數再次調用相同的方法。

0

您的args變量永遠不會爲null;您應該編碼:

return ExecuteNonQuery(procedure, null); 

或創建一個沒有args參數的過載。

0

您需要檢查列表的長度是否爲0,而不是空值。或者你可以通過它爲空,就像這樣:

public static int ExecuteNonQuery(String procedure, params SqlParameter[] args) 
{ 
      if (args == null) throw new ArgumentNullException("args"); 
      else 
      return ExecuteNonQuery(procedure, null); 
} 
+0

+1爲什麼這個否決? –

+0

1.'null'在重載時不能很好地運行 - 調用不明確,代碼不能編譯。讓我們假裝編譯它,那麼它會做什麼?下一個'args'將爲空,導致異常(但它不會)或'{null}',導致另一個無限循環... – Kobi

8

不要用空數組混淆的空數組。你再次用一個空數組調用同樣的方法,但唯一的檢查你必須停止這個函數,是檢查一個空數組,並拋出一個異常。你需要的東西,如:

if (args.length == 0) { 
    // bail out somehow 
} 

(你的空檢查後,爲防止NPE上)

0

因爲你把自己的return聲明。

1

該函數將遞歸無限,因爲不存在終止條件:當使用非空args參數調用它時,它只會調用自身的indentical參數,並且沒有什麼能夠阻止除堆棧空間外的無限遞歸。

1

也許你想要的東西,像

public static int ExecuteNonQuery(String procedure, params SqlParameter[] args) 
{ 
    if (args == null) 
     return ExecuteNonQuery(procedure, new SqlParameter[] { }); 

    // Do some stuff here where args can be assumed != null 
}