跳到主要内容

C# 存储过程调用

介绍

在C#数据库编程中,存储过程(Stored Procedure)是一种预编译的SQL代码块,存储在数据库中,可以通过调用来执行特定的操作。存储过程通常用于执行复杂的数据库操作,例如数据插入、更新、删除或查询。通过调用存储过程,可以提高代码的可维护性和性能,同时减少SQL注入的风险。

在本教程中,我们将学习如何在C#中调用存储过程,并通过实际案例展示其应用场景。

存储过程的基本概念

存储过程是数据库中的一段预编译的SQL代码,它可以接受输入参数并返回输出参数或结果集。存储过程的主要优点包括:

  • 性能优化:存储过程在数据库中预编译,执行速度更快。
  • 代码复用:存储过程可以在多个应用程序中重复使用。
  • 安全性:通过存储过程执行数据库操作,可以减少SQL注入的风险。

在C#中调用存储过程

要在C#中调用存储过程,我们需要使用 SqlCommand 对象,并将其 CommandType 属性设置为 CommandType.StoredProcedure。接下来,我们将通过一个简单的示例来演示如何调用存储过程。

示例:调用存储过程

假设我们有一个名为 GetEmployeeById 的存储过程,它接受一个员工ID作为输入参数,并返回该员工的详细信息。

存储过程定义

sql
CREATE PROCEDURE GetEmployeeById
@EmployeeId INT
AS
BEGIN
SELECT * FROM Employees WHERE EmployeeId = @EmployeeId
END

C# 代码示例

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

class Program
{
static void Main()
{
string connectionString = "YourConnectionStringHere";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand("GetEmployeeById", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@EmployeeId", 1);

using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine($"Employee ID: {reader["EmployeeId"]}, Name: {reader["Name"]}, Department: {reader["Department"]}");
}
}
}
}
}
}

代码解释

  1. 连接数据库:我们首先创建一个 SqlConnection 对象,并使用连接字符串打开数据库连接。
  2. 创建命令对象:我们创建一个 SqlCommand 对象,并将其 CommandText 设置为存储过程的名称。
  3. 设置命令类型:将 CommandType 设置为 CommandType.StoredProcedure,以指示我们要调用存储过程。
  4. 添加参数:使用 Parameters.AddWithValue 方法为存储过程添加输入参数。
  5. 执行存储过程:使用 ExecuteReader 方法执行存储过程,并读取返回的结果集。

输出示例

假设数据库中有以下数据:

EmployeeIdNameDepartment
1JohnIT
2JaneHR

运行上述代码后,输出将是:

Employee ID: 1, Name: John, Department: IT

实际应用场景

存储过程在实际开发中有广泛的应用场景,例如:

  • 批量数据处理:通过存储过程一次性处理大量数据,减少网络传输开销。
  • 复杂业务逻辑:将复杂的业务逻辑封装在存储过程中,简化应用程序代码。
  • 数据验证:在存储过程中进行数据验证,确保数据的完整性和一致性。

案例:批量插入数据

假设我们需要将一批员工数据插入到数据库中,可以使用存储过程来优化性能。

存储过程定义

sql
CREATE PROCEDURE InsertEmployees
@Employees EmployeeTableType READONLY
AS
BEGIN
INSERT INTO Employees (Name, Department)
SELECT Name, Department FROM @Employees
END

C# 代码示例

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

class Program
{
static void Main()
{
string connectionString = "YourConnectionStringHere";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand("InsertEmployees", connection))
{
command.CommandType = CommandType.StoredProcedure;

DataTable employeeTable = new DataTable();
employeeTable.Columns.Add("Name", typeof(string));
employeeTable.Columns.Add("Department", typeof(string));

employeeTable.Rows.Add("Alice", "Finance");
employeeTable.Rows.Add("Bob", "Marketing");

SqlParameter parameter = command.Parameters.AddWithValue("@Employees", employeeTable);
parameter.SqlDbType = SqlDbType.Structured;
parameter.TypeName = "EmployeeTableType";

command.ExecuteNonQuery();
}
}
}
}

代码解释

  1. 创建数据表:我们创建一个 DataTable 对象,并添加员工数据。
  2. 设置参数类型:将 SqlParameterSqlDbType 设置为 SqlDbType.Structured,并将 TypeName 设置为用户定义的表类型。
  3. 执行存储过程:使用 ExecuteNonQuery 方法执行存储过程,将数据批量插入到数据库中。

总结

通过本教程,我们学习了如何在C#中调用存储过程,并了解了存储过程的基本概念和实际应用场景。存储过程是数据库编程中的重要工具,能够提高代码的性能和可维护性。

提示

在实际开发中,建议将存储过程的调用封装在数据访问层(DAL)中,以便更好地管理数据库操作。

附加资源与练习

  • 练习:尝试创建一个存储过程,用于更新员工信息,并在C#中调用该存储过程。
  • 资源:阅读 Microsoft 官方文档 以了解更多关于 ADO.NET 和存储过程的内容。

通过不断练习和探索,你将能够熟练掌握C#中的存储过程调用技术,并在实际项目中灵活应用。