在ASP.NET中调用存储过程,可以通过多种方式实现,包括使用SqlCommand对象、SqlDataAdapter对象等,下面将详细介绍如何在ASP.NET中调用存储过程,包括创建存储过程、配置数据库连接、执行存储过程以及处理返回结果等步骤。

一、创建存储过程
假设我们在SQL Server的Northwind数据库上新建一个名为my_proc的存储过程,该存储过程用于返回目的地为美国的订单,具体命令如下:
USE Northwind; GO CREATE PROC my_proc AS SELECT * FROM orders WHERE ShipCountry='USA'; GO
二、ASP.NET中调用存储过程的步骤
1. 简单存储过程的应用
(1)创建调用简单存储过程的应用程序:
创建一个文件叫StorePro.aspx,其中用到了ADO.NET中的SqlDataAdapter对象以及DataSet对象,SqlDataAdapter对象作为SQL Server数据库和DataSet对象的桥梁将两者联系在一起,SqlDataAdapter对象包含了两个常用的方法:Fill( )方法和Update( )方法,而Fill( )方法能从数据库中获取相应数据并填充到DataSet对象中,在调用Fill()方法以前,我们必须设置好SqlDataAdapter对象的SelectCommand属性,该属性其实是一个SqlCommand对象,SelectCommand属性中包含有效的SQL语句,并能据此从数据库中获取相应数据并填充到DataSet对象中。
程序代码如下:
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>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server"></asp:GridView>
</div>
</form>
</body>
</html>
Default.aspx.cs:
using System;
using System.Data;
using System.Web.Security;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection sqlcon = new SqlConnection();
sqlcon.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True";
SqlDataAdapter da = new SqlDataAdapter("my_proc", sqlcon);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
DataSet ds = new DataSet();
try
{
sqlcon.Open();
da.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
finally
{
sqlcon.Close();
}
}
}
在这个例子中,我们首先创建了一个数据库连接对象SqlConnection,然后声明了一个SqlDataAdapter对象来执行存储过程my_proc,通过设置SelectCommand属性的CommandType为CommandType.StoredProcedure,我们指定了要执行的是一个存储过程,我们使用Fill方法将存储过程返回的结果填充到DataSet对象中,并通过GridView控件将结果显示在页面上。
2. 带参数的存储过程应用

有时候我们需要向存储过程传递参数,例如查询特定条件下的数据,这时我们可以使用SqlParameter类来添加参数,以下是一个示例,假设我们有一个存储过程GetOrdersByCustomerID,它接受一个客户ID作为参数,并返回该客户的所有订单。
CREATE PROCEDURE GetOrdersByCustomerID
@CustomerID int
AS
BEGIN
SELECT * FROM Orders WHERE CustomerID = @CustomerID;
END;
在ASP.NET中调用这个带参数的存储过程的代码如下:
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection sqlcon = new SqlConnection();
sqlcon.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True";
SqlCommand cmd = new SqlCommand("GetOrdersByCustomerID", sqlcon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@CustomerID", 1); // 假设我们要查询客户ID为1的订单
SqlDataReader reader = null;
try
{
sqlcon.Open();
reader = cmd.ExecuteReader();
while (reader.Read())
{
// 处理每一行数据,例如显示在页面上或添加到某个集合中
Response.Write(reader["OrderID"].ToString() + " " + reader["CustomerID"].ToString() + "<br/>");
}
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
finally
{
if (reader != null) reader.Close();
sqlcon.Close();
}
}
在这个例子中,我们首先创建了一个SqlCommand对象,并设置了其CommandText属性为存储过程的名称GetOrdersByCustomerID,我们通过Parameters.AddWithValue方法向存储过程传递了一个参数@CustomerID,其值为1,我们执行存储过程,并通过SqlDataReader读取返回的结果,我们将每一行数据输出到页面上。
1. 归纳
在ASP.NET中调用存储过程通常涉及以下几个步骤:
创建数据库连接:使用SqlConnection类连接到数据库。
声明数据库命令:使用SqlCommand类来执行SQL语句和存储过程,对于存储过程,需要设置CommandType为CommandType.StoredProcedure。
设置参数(如果需要):使用SqlParameter类向存储过程传递参数。
执行存储过程:根据不同的需求,可以选择使用ExecuteNonQuery(对于不返回记录集的存储过程)、ExecuteScalar(对于返回单个值的存储过程)或ExecuteReader(对于返回记录集的存储过程)方法来执行存储过程。

处理返回结果:根据存储过程的类型,可以填充DataSet、读取单个值或遍历记录集。
关闭连接:在完成所有操作后,确保关闭数据库连接以释放资源。
2. 注意事项
安全性:在向存储过程传递参数时,要注意防止SQL注入攻击,可以使用参数化查询来提高安全性。
性能优化:存储过程本身具有预编译的优势,可以提高执行效率,但过多的复杂逻辑可能会导致维护困难,因此需要在设计时权衡利弊。
错误处理:在执行存储过程时,可能会遇到各种错误(如数据库连接失败、SQL语法错误等),应该使用try-catch块来捕获并处理这些错误,以提高程序的健壮性。
事务管理:如果存储过程中涉及多个操作(如插入、更新、删除等),建议使用事务来确保数据的一致性和完整性,可以在存储过程中使用BEGIN TRANSACTION、COMMIT TRANSACTION和ROLLBACK TRANSACTION语句来管理事务。
到此,以上就是小编对于“asp.net 怎么调用存储过程”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。