2009-12-28 40 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 
}