在 ASP.NET 中调用 SQL Server 存储过程是常见的数据库操作方式,以下是详细步骤和示例代码:

核心步骤
- 创建存储过程(SQL Server 端)
- 配置连接字符串(Web.config)
- 使用 ADO.NET 调用存储过程(C# 代码)
示例场景
假设存在存储过程 GetEmployeeDetails:
CREATE PROCEDURE GetEmployeeDetails
@EmployeeID INT,
@DepartmentName NVARCHAR(50) OUTPUT
AS
BEGIN
SELECT Name, Position FROM Employees WHERE ID = @EmployeeID
SELECT @DepartmentName = Department FROM EmployeeDetails WHERE EmployeeID = @EmployeeID
END
实现代码 (C#)
配置连接字符串 (Web.config)
<connectionStrings>
<add name="MyDB"
connectionString="Server=.;Database=YourDB;Integrated Security=True;"
providerName="System.Data.SqlClient"/>
</connectionStrings>
C# 调用代码
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI.WebControls;
public partial class EmployeePage : System.Web.UI.Page
{
protected void GetEmployeeData(int employeeId)
{
// 从配置获取连接字符串
string connString = System.Configuration.ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connString))
{
// 创建命令对象并指定为存储过程
using (SqlCommand cmd = new SqlCommand("GetEmployeeDetails", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
try
{
// 添加输入参数
cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = employeeId;
// 添加输出参数
SqlParameter deptOutput = new SqlParameter("@DepartmentName", SqlDbType.NVarChar, 50);
deptOutput.Direction = ParameterDirection.Output;
cmd.Parameters.Add(deptOutput);
conn.Open();
// 方案1:获取DataReader(读取结果集)
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
string name = reader["Name"].ToString();
string position = reader["Position"].ToString();
// 处理数据...
}
}
}
// 方案2:获取输出参数值(需先关闭DataReader)
string department = deptOutput.Value.ToString();
// 方案3:无返回结果时(如增删改)
// int rowsAffected = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
// 错误处理
throw new Exception("数据库操作失败", ex);
}
}
}
}
}
关键点说明
-
参数方向

ParameterDirection.Input(默认)ParameterDirection.OutputParameterDirection.InputOutputParameterDirection.ReturnValue
-
不同执行方式
ExecuteReader():返回结果集(多行数据)ExecuteNonQuery():返回受影响行数(INSERT/UPDATE/DELETE)ExecuteScalar():返回单个值(如 COUNT(*))
-
参数类型匹配

- 必须与存储过程定义的 SQL 类型匹配(如
SqlDbType.Int对应 SQL 的INT)
- 必须与存储过程定义的 SQL 类型匹配(如
最佳实践
- 使用
using语句:自动释放连接和命令对象 - 参数化查询:防止 SQL 注入攻击
- 错误处理:用 try-catch 包裹数据库操作
- 连接字符串管理:集中存储在配置文件中
- 异步操作(可选):使用
ExecuteReaderAsync()等异步方法提高并发能力
注意:实际使用时需替换数据库连接字符串、存储过程名称和参数名称,并根据业务需求处理返回结果。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/286434.html

