昨天晚上写程序执行存储过程 调用以下函数

/**//// <summary>
/// 执行存储过程,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行
/// </summary>
/// <param name="proName">存储过程名称</param>
/// <param name="param">存储过程参数</param>
/// <returns>返回值为object 使用时需要拆箱操作</returns>
public static object ExecScalar(string proName,SqlParameter[] param)

...{
object obj=new object();
try

...{
OpenConn();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = proName;
for(int i = 0; i < param.Length; i++)

...{
cmd.Parameters.Add(param[i]);
}
obj = cmd.ExecuteScalar();
}
catch(Exception e)

...{
throw new Exception(e.Message);
}
finally

...{
CloseConn();
}
return obj;
}
在第一次运行可以正常执行,第二次运行提示存储指定参数太多,把以上函数改为下面的代码可以执行正常

/**//// <summary>
/// 执行存储过程,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行
/// </summary>
/// <param name="proName">存储过程名称</param>
/// <param name="param">存储过程参数</param>
/// <returns>返回值为object 使用时需要拆箱操作</returns>
public static object ExecScalar(string proName,SqlParameter[] param)

...{
object obj=new object();
try

...{
OpenConn();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = proName;
for(int i = 0; i < param.Length; i++)

...{
cmd.Parameters.Add(param[i]);
}
obj = cmd.ExecuteScalar();
}
catch(Exception e)

...{
throw new Exception(e.Message);
}
finally

...{
CloseConn();
cmd.Parameters.Clear(); //注意这一句 解决参数太多问题的关键
}
return obj;
}









































































原因应该是第一次调用的SqlParameter参数在SqlCommand的参数列表中未被释放 而二次调用又传入参数导致SqlCommand中的参数数量递增,这样就导致了参数太多的错误。
在程序中增加SqlCommand.Parameters.Clear();方法在每次执行完存储过程的时候就释放SqlCommand的参数列表,这样在每次调用执行存储过程时就是本次传入的正确参数。
我的理解是这样的。