在ASP.NET中调用存储过程并获取其输出参数(OUTPUT)和返回值(RETURN)是一个常见的需求,以下是详细的步骤和示例代码,帮助你理解如何在ASP.NET中实现这一功能。

创建存储过程
我们需要在数据库中创建一个带有OUTPUT参数和RETURN值的存储过程,以下是一个示例存储过程:
CREATE PROCEDURE Proc_Test;1
@INPUT int,
@OUTPUT int output
AS
BEGIN
SET NOCOUNT ON;
SELECT @OUTPUT = @INPUT;
RETURN @INPUT + 1;
END
GO
这个存储过程接受一个输入参数@INPUT,将其赋值给输出参数@OUTPUT,并返回@INPUT + 1作为RETURN值。
在ASP.NET中调用存储过程
我们在ASP.NET中调用这个存储过程,并获取其输出参数和返回值,以下是一个完整的示例,包括ASPX页面和后台代码。
ASPX页面 (Default.aspx)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>使用存储过程</title>
<style type="text/css">
/* 样式定义 */
</style>
</head>
<body>
<form id="form1" runat="server" style="border-style: none; width: 339px;">
<div>
<asp:Label ID="Label3" runat="server" Text="输入参数:" />
<asp:TextBox ID="Input" runat="server" BorderStyle="NotSet" />
<asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/提交.GIF" OnClick="ImageButton1_Click" style="height: 20px" />
<hr width="95%" />
<br />
<asp:Label ID="Label1" runat="server" Text="OUTPUT参数:" />
<asp:Label ID="Output" runat="server" BorderColor="#6600FF" BorderStyle="None" BorderWidth="1px" Width="100px">暂无</asp:Label>
<hr width="95%" />
<br />
<asp:Label ID="Label4" runat="server" Text="RETURN返回:" />
<asp:Label ID="Return" runat="server" BorderColor="#6600FF" BorderWidth="1px" Width="100px" BorderStyle="None">暂无</asp:Label>
</div>
</form>
</body>
</html>
后台代码 (Default.aspx.cs)

using System;
using System.Data.SqlClient;
public partial class _Default : System.Web.UI.Page
{
protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
{
// 定义数据库连接和SqlCommand对象
SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["TestConnection"].ToString());
SqlCommand Cmd = new SqlCommand("Proc_Test;1", Conn);
Cmd.CommandType = CommandType.StoredProcedure;
// 指定参数类型
SqlParameter input = Cmd.Parameters.Add("@INPUT", SqlDbType.Int);
SqlParameter output = Cmd.Parameters.Add("@OUTPUT", SqlDbType.Int);
output.Direction = ParameterDirection.Output; // 设置参数方向为输出
try
{
Conn.Open();
input.Value = Convert.ToInt32(Input.Text); // 从文本框获取输入值
Cmd.ExecuteNonQuery(); // 执行存储过程
// 获取OUTPUT参数和RETURN值
int returnValue = (int)Cmd.Parameters["@RETURN_VALUE"].Value; // RETURN值
int outputValue = (int)output.Value; // OUTPUT参数值
// 显示结果
Output.Text = outputValue.ToString();
Return.Text = returnValue.ToString();
}
catch (Exception ex)
{
// 处理异常
Output.Text = "Error";
Return.Text = "Error";
}
finally
{
Conn.Close(); // 关闭连接
}
}
}
解释说明
1、存储过程:我们创建了一个名为Proc_Test;1的存储过程,它接受一个输入参数@INPUT,将其赋值给输出参数@OUTPUT,并返回@INPUT + 1作为RETURN值。
2、ASPX页面:页面包含三个标签(Label)用于显示输入参数、OUTPUT参数和RETURN返回值,以及一个文本框(TextBox)用于输入参数和一个按钮(ImageButton)用于触发事件。
3、后台代码:在按钮点击事件中,我们首先定义数据库连接和SqlCommand对象,然后添加输入和输出参数,并设置输出参数的方向为ParameterDirection.Output,执行存储过程后,我们从命令参数中获取OUTPUT参数和RETURN值,并将其显示在页面上。
相关问题与解答
问题1:如何在ASP.NET中调用存储过程并获取多个输出参数?
答:在ASP.NET中调用存储过程并获取多个输出参数的方法与获取单个输出参数类似,你只需要在添加参数时指定每个输出参数的方向为ParameterDirection.Output,然后在执行存储过程后从命令参数***中获取这些输出参数的值。

SqlParameter outputParam1 = Cmd.Parameters.Add("@OutParam1", SqlDbType.Int);
outputParam1.Direction = ParameterDirection.Output;
SqlParameter outputParam2 = Cmd.Parameters.Add("@OutParam2", SqlDbType.Int);
outputParam2.Direction = ParameterDirection.Output;
// 执行存储过程...
int outValue1 = (int)outputParam1.Value;
int outValue2 = (int)outputParam2.Value;
问题2:如何在ASP.NET中使用事务调用存储过程?
答:在ASP.NET中使用事务调用存储过程可以通过SqlTransaction类来实现,以下是一个示例:
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlTransaction transaction = conn.BeginTransaction();
try
{
using (SqlCommand cmd = new SqlCommand("Proc_Test;1", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Transaction = transaction; // 将命令分配到事务
// 添加参数并执行命令...
transaction.Commit(); // 提交事务
}
}
catch (Exception ex)
{
try
{
transaction.Rollback(); // 回滚事务
}
catch (Exception exRollback)
{
// 处理回滚异常
}
// 处理原始异常
}
}
小伙伴们,上文介绍了“asp.net 存储过程 output”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。