在 ASP.NET 中调用 SQL Server 存储过程可以通过 ADO.NET 实现,以下是详细步骤和示例代码:

步骤 1:创建存储过程(SQL Server 示例)
CREATE PROCEDURE GetEmployeeByID
@EmployeeID INT
AS
BEGIN
SELECT * FROM Employees WHERE EmployeeID = @EmployeeID
END
步骤 2:ASP.NET C# 调用代码(使用 ADO.NET)
示例 1:基础版(带参数)
using System.Data;
using System.Data.SqlClient;
public Employee GetEmployee(int employeeId)
{
Employee emp = null;
// 从配置获取连接字符串(推荐在 Web.config 中配置)
string connString = ConfigurationManager.ConnectionStrings["YourDbConnection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connString))
{
using (SqlCommand cmd = new SqlCommand("GetEmployeeByID", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@EmployeeID", employeeId);
conn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
emp = new Employee
{
ID = (int)reader["EmployeeID"],
Name = reader["Name"].ToString(),
Department = reader["Department"].ToString()
};
}
}
}
}
return emp;
}
示例 2:带输出参数
public int CreateEmployee(Employee emp)
{
int newID = -1;
string connString = ConfigurationManager.ConnectionStrings["YourDbConnection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connString))
{
using (SqlCommand cmd = new SqlCommand("sp_CreateEmployee", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
// 输入参数
cmd.Parameters.AddWithValue("@Name", emp.Name);
cmd.Parameters.AddWithValue("@Department", emp.Department);
// 输出参数
SqlParameter outParam = new SqlParameter("@NewID", SqlDbType.Int);
outParam.Direction = ParameterDirection.Output;
cmd.Parameters.Add(outParam);
conn.Open();
cmd.ExecuteNonQuery();
// 获取输出参数值
newID = (int)cmd.Parameters["@NewID"].Value;
}
}
return newID;
}
配置 Web.config
<connectionStrings>
<add name="YourDbConnection"
connectionString="Server=your_server;Database=your_db;User Id=user;Password=pass;"
providerName="System.Data.SqlClient"/>
</connectionStrings>
关键点说明:
- 参数化查询:始终使用
Parameters.AddWithValue()防止 SQL 注入 - 资源释放:使用
using语句确保连接和命令对象自动释放 - 参数类型:
- 输入参数:
AddWithValue("@Param", value) - 输出参数:设置
Direction = ParameterDirection.Output - 返回值:使用
ParameterDirection.ReturnValue
- 输入参数:
- 执行方法:
ExecuteReader():返回结果集(SELECT)ExecuteNonQuery():执行操作不返回数据(INSERT/UPDATE/DELETE)ExecuteScalar():返回单个值
处理事务
using (SqlTransaction transaction = conn.BeginTransaction())
{
try
{
cmd.Transaction = transaction;
// 执行多个操作...
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
异步版本(ASP.NET 4.5+)
public async Task<Employee> GetEmployeeAsync(int id)
{
using (SqlConnection conn = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand("GetEmployeeByID", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@EmployeeID", id);
await conn.OpenAsync();
using (SqlDataReader reader = await cmd.ExecuteReaderAsync())
{
// 处理数据...
}
}
}
最佳实践:
- 将连接字符串存储在配置文件中
- 使用参数化查询防止 SQL 注入
- 通过
using确保资源释放 - 重要操作添加事务支持
- 对高并发场景使用异步方法
- 验证存储过程返回值和错误代码
注意:实际项目中建议使用 Entity Framework 或 Dapper 等 ORM 工具简化存储过程调用,但原生 ADO.NET 在性能关键场景仍有优势。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/286020.html

