代码改变世界

C#调用存储过程,获取 output 参数

2011-04-27 20:07  Dreamer57  阅读(1452)  评论(0)    收藏  举报
     // C#调用存储过程
public Hashtable GetAmount(string userId)
{
string procedureName = "SP_GetAmount";
SqlParameter[] param
= new SqlParameter[] { new SqlParameter("@AllAmount", SqlDbType.Decimal), new SqlParameter("@MonthAmount", SqlDbType.Decimal), new SqlParameter("@UserID", userId) };
param[
2].Direction = ParameterDirection.Input;  // 设置输入参数
param[
0].Direction = ParameterDirection.Output; // 输出参数 这里故意把位置能乱,为了说明C#调用存储过程参数是以 名称=参数 匹配的
param[
1].Direction = ParameterDirection.Output; // 注意输出参数 必须 new SqlParameter("@MonthAmount", SqlDbType.Decimal) 设定DbType

return new DBHelper().RunProcedure(procedureName, param);
}
  
     // DBHelper 中 RunProcedure 函数内容
     
public Hashtable RunProcedure(String procedureName, IDataParameter[] parameters)
        {
            Hashtable result = new Hashtable();
            try
            {
                using (SqlConnection connection = this.Connection)
                {
                    using (SqlCommand cmd = new SqlCommand(procedureName, connection))
                    {
         // 注意这里要把CommandType设为StoredProcedure解析为存储过程
         // 也可默认为Text 以SQL语句模式解析,这样调用存储过程就要用SQL语句 EXEC <存储过程名> <参数...> 写 SQL 语句调用
                        cmd.CommandType = CommandType.StoredProcedure;
                        if (parameters != null)
                        {
                            cmd.Parameters.AddRange(parameters);
                        }
                        cmd.ExecuteNonQuery();
                        foreach (SqlParameter param in cmd.Parameters)
                        {
           // 这里把输出参数放到一个 HashTable 里面,方便取出
                            if (param.Direction == ParameterDirection.Output || param.Direction == ParameterDirection.InputOutput || param.Direction == ParameterDirection.ReturnValue)
                            {
                                result.Add(param.ParameterName, param.Value);
                            }
                        }
                    }
                }
            }
            catch (Exception)
            {
                return null;
            }
            return result;
        }

   // 取出 output 参数时
   Hashtable amount = orderBIZ.GetAmount(Request.Cookies["LoginUser"].Value);
        ViewData["AllAmount"] = amount["@AllAmount"];  // 取出 output 参数
        ViewData["MonthAmount"] = amount["@MonthAmount"];

非常幼稚的东西了,都不好意思发了,不过还是发了 - -