9.4.3 使用SqlCommand对象执行存储过程

  前面我们介绍使用 SqlCommand 执行一个参数化的SQL语句,现在我们来学习如何使用SqlCommand执行存储过程。为了能更灵活地指定参数,我们在页面上添加两个文本框,tbClassName 和 tbBoardname,和一个用于添加版块的按钮 btn_AddBoard,双击添加按钮Click事件处理程序。
    protected void Button1_Click(object sender, EventArgs e)
    {
        
string sConnectionString = @"Server=(local)\SQLEXPRESS;database=Forum;Trusted_Connection=True";
        
using (SqlConnection conn = new SqlConnection(sConnectionString))
        {
            conn.Open();
            
using (SqlCommand cmd = new SqlCommand("CreateBoard", conn))
            {
                cmd.CommandType 
= CommandType.StoredProcedure;
                cmd.Parameters.Add(
"@ClassName", SqlDbType.VarChar, 50);
                cmd.Parameters[
"@ClassName"].Value = tbClassName.Text;
                cmd.Parameters[
"@ClassName"].Direction = ParameterDirection.Input;
                cmd.Parameters.Add(
"@BoardName", SqlDbType.VarChar, 50);
                cmd.Parameters[
"@BoardName"].Value = tbBoardName.Text;
                cmd.Parameters[
"@BoardName"].Direction = ParameterDirection.Input;
                cmd.Parameters.Add(
"@ClassID", SqlDbType.VarChar, 50);
                cmd.Parameters[
"@ClassID"].Direction = ParameterDirection.Output;
                cmd.Parameters.Add(
"@BoardCount", SqlDbType.Int);
                cmd.Parameters[
"@BoardCount"].Direction = ParameterDirection.ReturnValue;
                cmd.ExecuteNonQuery();
                
foreach (SqlParameter parameter in cmd.Parameters)
                {
                    Response.Write(
string.Format("参数名: {0}, 参数方向: {1}, 参数值: {2}<br />", parameter.ParameterName, parameter.Direction.ToString(), parameter.Value));
                }
            }
        }

 

  在这段代码中,要注意以下几点。

  1. CommandType 枚举。用来枚举所有的命令类型,默认是 CommandType.Text,用于执行SQL语句。如果我们把SqlCommand 的 CommandText 设置为一个存储过程名,则应该指字 CommandType 为 CommandType.StoredProcedure。

  2. Parameters 集合。我们需要把所有存储过程需要的参数都添加到 SqlCommand 的 SqlParameterCollection 集合中去,参数名、参数类型和参数大小都应该和存储过程中声明的参数对应。

  3. 参数的类型和值。对于输入参数,我们可以通过Parameter的Value属性为其指定一个值。我们注意到,这个值可以是任意类型的。对于输出参数和返回参数,在存储过程执行以前它们的值都为空,在存储过程执行以后,我们可以通过再次访问 SqlParameterCollection 集合来获取参数的值。

  我们看到,@ClassID输出参数的值被设置成了 @ClassName 参数对应的分类的分类ID;@BoardCount返回参数的值被设置成 tbBoard表中记录的总数。

posted @ 2008-07-30 22:43  Jack.Net  阅读(3619)  评论(0编辑  收藏  举报