以前在c#中调用带参数的存储过程,每次都是自己一个一个的去配置参数,有时候参数多了配置起来比较麻烦。
        这不,今天又碰到了同样的麻烦了。
        想呀想,怎么才能够偷懒呢?
                 让程序自动匹配参数,哈哈
----------------------------------------------------------------------
         SqlServer中有个这样的存储过程 sp_sproc_columns ,她可以获取单个存储过程或者用户自定义函数的列信息。我今天就用她来获取存储过程的参数信息(用户自定义函数的我在这里就不写了)。
         sp_sproc_columns有6个可写可不写的参数。因为我是要查询指定存储过程的参数,所以在调用她的时候还得带上存储过程名,否则她会将当前数据库里所有的存储过程和自定义函数的信息都查询出来,这样太浪费时间了。
      sp_sproc_columns取得的结果是一个数据集,里面有一个列名叫RETURN_VALUE的参数,我们在设置参数的时候需要把它过滤,因为它代表的是存储过程的返回值。其它参数就都是存储过程所需要配置的参数了。在这里需要注意的是参数的列类型COLUMN_TYPE,一般情况下只会出现3种值,即RETURN_VALUE的值为5,INPUT参数的值为1,Output参数的值为2。在配置参数的时候:1、首先需要排除将@RETURN_VALUE,2、Output参数的ParameterDirection类型设置要为Output。
下面我将展示我的c#代码,欢饮各位同行来与我探讨。
如有不完善的地方欢迎指教!
 
C#代码:
        /// <summary>
        /// 获取存储过程的参数列表
        /// </summary>
        /// <param name="proc_Name">存储过程名称</param>
        /// <returns>DataTable</returns>
        private static DataTable GetParameters(string proc_Name)
        {
            SqlCommand comm = new SqlCommand("dbo.sp_sproc_columns_90", new SqlConnection(SqlHelper.ConnectionStringMBCheckoutPayPal));
            comm.CommandType = CommandType.StoredProcedure;
            comm.Parameters.AddWithValue("@procedure_name", (object)proc_Name);
            SqlDataAdapter sda = new SqlDataAdapter(comm);
            DataTable dt = new DataTable();
            sda.Fill(dt);
            return dt;
        }
        /// <summary>
        /// 为 SqlCommand 添加参数及赋值
        /// </summary>
        /// <param name="comm">SqlCommand</param>
        /// <param name="paraValues">参数数组(必须遵循存储过程参数列表的顺序)</param>
        private static void AddInParaValues(SqlCommand comm, params object[] paraValues)
        {
            comm.Parameters.Add(new SqlParameter("@RETURN_VALUE", SqlDbType.Int));
            comm.Parameters["@RETURN_VALUE"].Direction = ParameterDirection.ReturnValue;
            if (paraValues != null)
            {
                DataTable dt = GetParameters(comm.CommandText);
                int i = 0;
                foreach (DataRow row in dt.Rows)
                {
                    string key = row[3].ToString();
                    if (key != "@RETURN_VALUE")
                    {
                        int value = int.Parse(row[4].ToString());
                        if (value == 1)
                        {
                            comm.Parameters.AddWithValue(key, paraValues[i]);
                        }
                        else if (value == 2)//value为2则是输出参数
                        {
                            comm.Parameters.AddWithValue(key, paraValues[i]).Direction = ParameterDirection.Output;
                            //comm.Parameters[key].Direction = ParameterDirection.Output;
                        }
                        i++;
                    }
                }
            }
        }