C# 执行存储提示指定参数太多

来源:互联网 发布:apache spark 介绍 编辑:程序博客网 时间:2024/04/29 08:57
昨天晚上写程序执行存储过程 调用以下函数
/// <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的参数列表,这样在每次调用执行存储过程时就是本次传入的正确参数。

我的理解是这样的。