在网上也找到许多关于.NET中使用存储过程获取输出参数的代码,但怎么看怎么都是记不住,还是自己亲自实践一遍后再记录下来,这样才能记得住,必竟自己做过的东西是比较难忘记的!!!

    步骤如下:

    ①建立数据库logintest,在数据库中建立表User.


     向建立的表中添加几条测试数据.

    ②在数据库中建立存储过程: Sql代码


USE [logintest]
GO
-- =============================================
-- Author:		牛腩
-- Create date: 2008-10-21 14:01
-- Description:	通过传入的uid获取用户姓名
-- =============================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[GetUNameById]
@uid int,
@name varchar(50) output
AS
BEGIN
	select @name=uname from [User] where uid=@uid
END


    ③在VS中建立一个测试页面ProcTest.aspx,在ProcTest.aspx.cs中导入命名空间

C#代码


using System.Data;
using System.Data.SqlClient;


    ④在Page_Load方法里写入如下代码:

C#代码

// 建立连接字符串,在正式项目中可放在web.config中
        string connStr = "server=niunan\\sqlexpress;uid=sa;pwd=123456;database=logintest";
        // 连接数据库
        SqlConnection conn = new SqlConnection(connStr);

        try
        {
            // 打开数据库连接
            conn.Open();
            // 创建用于执行数据库操作的命令对象, GetUNameById为存储过程名称
            SqlCommand cmd = new SqlCommand("GetUNameById", conn);
            // 设置执行命令的方式为存储过程
            cmd.CommandType = CommandType.StoredProcedure;

            // 向命令对象添加存储过程所需要的参数
            cmd.Parameters.Add("@uid", SqlDbType.Int);
            // 设置要传入到存储过程的参数值
            cmd.Parameters["@uid"].Value = 2;

            // 添加存储过程中的输出参数,如果是字符型的必须定义长度
            cmd.Parameters.Add("@name", SqlDbType.VarChar, 50);
            // 设置参数为output输出参数
            cmd.Parameters["@name"].Direction = ParameterDirection.Output;

            // 执行存储过程
            cmd.ExecuteReader();

            // 获取执行存储过程后的输出参数
            string name = cmd.Parameters["@name"].Value.ToString();

            Response.Write(name);
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }
        finally
        {
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }


    运行ASPX页面,则能够看到执行存储过程后返回的结果!

    需要注意的是如果输出参数是varchar类型的话则必须定义长度,否则会出错,如果输出参数是数字型的话就不必定义长度了!

    下面是完整的ProcTest.aspx.cs的源码:

C#代码


1. using System;   
2. using System.Collections.Generic;   
3. using System.Linq;   
4. using System.Web;   
5. using System.Web.UI;   
6. using System.Web.UI.WebControls;   
7. using System.Data;   
8. using System.Data.SqlClient;   
9.   
10. public partial class ProcTest : System.Web.UI.Page   
11. {   
12.     protected void Page_Load(object sender, EventArgs e)   
13.     {   
14.         // 建立连接字符串,在正式项目中可放在web.config中   
15.         string connStr = "server=niunan\\sqlexpress;uid=sa;pwd=123456;database=logintest";   
16.         // 连接数据库   
17.         SqlConnection conn = new SqlConnection(connStr);   
18.   
19.         try  
20.         {   
21.             // 打开数据库连接   
22.             conn.Open();   
23.             // 创建用于执行数据库操作的命令对象, GetUNameById为存储过程名称   
24.             SqlCommand cmd = new SqlCommand("GetUNameById", conn);   
25.             // 设置执行命令的方式为存储过程   
26.             cmd.CommandType = CommandType.StoredProcedure;   
27.   
28.             // 向命令对象添加存储过程所需要的参数   
29.             cmd.Parameters.Add("@uid", SqlDbType.Int);   
30.             // 设置要传入到存储过程的参数值   
31.             cmd.Parameters["@uid"].Value = 2;   
32.   
33.             // 添加存储过程中的输出参数   
34.             cmd.Parameters.Add("@name", SqlDbType.VarChar, 50);   
35.             // 设置参数为output输出参数   
36.             cmd.Parameters["@name"].Direction = ParameterDirection.Output;   
37.   
38.             // 执行存储过程   
39.             cmd.ExecuteReader();   
40.   
41.             // 获取执行存储过程后的输出参数   
42.             string name = cmd.Parameters["@name"].Value.ToString();   
43.   
44.             Response.Write(name);   
45.         }   
46.         catch (Exception ex)   
47.         {   
48.             Response.Write(ex.Message);   
49.             if (conn.State == ConnectionState.Open)   
50.             {   
51.                 conn.Close();   
52.             }   
53.         }   
54.         finally  
55.         {   
56.             if (conn.State == ConnectionState.Open)   
57.             {   
58.                 conn.Close();   
59.             }   
60.         }    
61.     }   
62. }