位置: 文档库 > C#(.NET) > C#访问SqlServer的工具类SqlServerHelper

C#访问SqlServer的工具类SqlServerHelper

牵牛不负轭 上传于 2021-07-03 15:37

《C#访问SqlServer的工具类SqlServerHelper》

在.NET开发中,数据库操作是核心功能之一。对于SqlServer数据库,虽然可以通过ADO.NET直接编写连接、命令执行等代码,但这种方式存在代码冗余、易出错、维护困难等问题。本文将介绍一个基于C#的SqlServerHelper工具类,它封装了常用的数据库操作方法,包括连接管理、参数化查询、事务处理等,能够显著提高开发效率并增强代码的可维护性。

一、SqlServerHelper工具类的设计目标

SqlServerHelper工具类的设计目标是为C#开发者提供一套简单、高效、安全的SqlServer数据库访问接口。具体目标包括:

  • 简化数据库连接管理,避免重复创建和释放连接对象。

  • 支持参数化查询,防止SQL注入攻击。

  • 提供常用数据库操作方法,如增删改查。

  • 支持事务处理,确保数据一致性。

  • 提高代码可读性和可维护性。

二、SqlServerHelper工具类的实现

1. 数据库连接管理

数据库连接是数据库操作的基础。SqlServerHelper通过封装SqlConnection对象,提供统一的连接管理方法。

using System.Data.SqlClient;

public class SqlServerHelper
{
    private static string connectionString = "Your_Connection_String";

    public static SqlConnection GetConnection()
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        return connection;
    }

    public static void CloseConnection(SqlConnection connection)
    {
        if (connection != null && connection.State != System.Data.ConnectionState.Closed)
        {
            connection.Close();
        }
    }
}

在上述代码中,GetConnection方法用于创建并打开数据库连接,CloseConnection方法用于关闭连接。通过静态方法封装,可以避免在每个操作中重复编写连接管理代码。

2. 参数化查询

参数化查询是防止SQL注入攻击的有效手段。SqlServerHelper提供了ExecuteNonQuery、ExecuteScalar和ExecuteReader等方法,支持参数化查询。

public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
{
    using (SqlConnection connection = GetConnection())
    {
        using (SqlCommand command = new SqlCommand(sql, connection))
        {
            if (parameters != null)
            {
                command.Parameters.AddRange(parameters);
            }
            return command.ExecuteNonQuery();
        }
    }
}

public static object ExecuteScalar(string sql, params SqlParameter[] parameters)
{
    using (SqlConnection connection = GetConnection())
    {
        using (SqlCommand command = new SqlCommand(sql, connection))
        {
            if (parameters != null)
            {
                command.Parameters.AddRange(parameters);
            }
            return command.ExecuteScalar();
        }
    }
}

public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] parameters)
{
    SqlConnection connection = GetConnection();
    SqlCommand command = new SqlCommand(sql, connection);
    if (parameters != null)
    {
        command.Parameters.AddRange(parameters);
    }
    return command.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
}

上述代码中,ExecuteNonQuery用于执行不返回结果集的SQL语句(如INSERT、UPDATE、DELETE),ExecuteScalar用于执行返回单个值的SQL语句(如COUNT、SUM),ExecuteReader用于执行返回结果集的SQL语句(如SELECT)。通过参数化查询,可以确保SQL语句的安全性。

3. 事务处理

事务处理是确保数据一致性的重要手段。SqlServerHelper提供了BeginTransaction、CommitTransaction和RollbackTransaction等方法,支持事务处理。

public static SqlTransaction BeginTransaction()
{
    SqlConnection connection = GetConnection();
    return connection.BeginTransaction();
}

public static void CommitTransaction(SqlTransaction transaction)
{
    if (transaction != null)
    {
        transaction.Commit();
    }
}

public static void RollbackTransaction(SqlTransaction transaction)
{
    if (transaction != null)
    {
        transaction.Rollback();
    }
}

public static int ExecuteNonQueryWithTransaction(string sql, SqlTransaction transaction, params SqlParameter[] parameters)
{
    using (SqlCommand command = new SqlCommand(sql, transaction.Connection, transaction))
    {
        if (parameters != null)
        {
            command.Parameters.AddRange(parameters);
        }
        return command.ExecuteNonQuery();
    }
}

在上述代码中,BeginTransaction方法用于开始一个事务,CommitTransaction方法用于提交事务,RollbackTransaction方法用于回滚事务。ExecuteNonQueryWithTransaction方法用于在事务中执行不返回结果集的SQL语句。

4. 完整工具类示例

结合上述方法,完整的SqlServerHelper工具类示例如下:

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

public class SqlServerHelper
{
    private static string connectionString = "Your_Connection_String";

    public static SqlConnection GetConnection()
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        return connection;
    }

    public static void CloseConnection(SqlConnection connection)
    {
        if (connection != null && connection.State != ConnectionState.Closed)
        {
            connection.Close();
        }
    }

    public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
    {
        using (SqlConnection connection = GetConnection())
        {
            using (SqlCommand command = new SqlCommand(sql, connection))
            {
                if (parameters != null)
                {
                    command.Parameters.AddRange(parameters);
                }
                return command.ExecuteNonQuery();
            }
        }
    }

    public static object ExecuteScalar(string sql, params SqlParameter[] parameters)
    {
        using (SqlConnection connection = GetConnection())
        {
            using (SqlCommand command = new SqlCommand(sql, connection))
            {
                if (parameters != null)
                {
                    command.Parameters.AddRange(parameters);
                }
                return command.ExecuteScalar();
            }
        }
    }

    public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] parameters)
    {
        SqlConnection connection = GetConnection();
        SqlCommand command = new SqlCommand(sql, connection);
        if (parameters != null)
        {
            command.Parameters.AddRange(parameters);
        }
        return command.ExecuteReader(CommandBehavior.CloseConnection);
    }

    public static SqlTransaction BeginTransaction()
    {
        SqlConnection connection = GetConnection();
        return connection.BeginTransaction();
    }

    public static void CommitTransaction(SqlTransaction transaction)
    {
        if (transaction != null)
        {
            transaction.Commit();
        }
    }

    public static void RollbackTransaction(SqlTransaction transaction)
    {
        if (transaction != null)
        {
            transaction.Rollback();
        }
    }

    public static int ExecuteNonQueryWithTransaction(string sql, SqlTransaction transaction, params SqlParameter[] parameters)
    {
        using (SqlCommand command = new SqlCommand(sql, transaction.Connection, transaction))
        {
            if (parameters != null)
            {
                command.Parameters.AddRange(parameters);
            }
            return command.ExecuteNonQuery();
        }
    }
}

三、SqlServerHelper工具类的使用

使用SqlServerHelper工具类可以显著简化数据库操作代码。以下是一些使用示例:

1. 插入数据

string insertSql = "INSERT INTO Users (Name, Age) VALUES (@Name, @Age)";
SqlParameter[] parameters = new SqlParameter[]
{
    new SqlParameter("@Name", "John"),
    new SqlParameter("@Age", 30)
};
int affectedRows = SqlServerHelper.ExecuteNonQuery(insertSql, parameters);
Console.WriteLine($"插入数据成功,影响行数:{affectedRows}");

2. 查询数据

string selectSql = "SELECT * FROM Users WHERE Age > @Age";
SqlParameter[] parameters = new SqlParameter[]
{
    new SqlParameter("@Age", 25)
};
using (SqlDataReader reader = SqlServerHelper.ExecuteReader(selectSql, parameters))
{
    while (reader.Read())
    {
        Console.WriteLine($"ID: {reader["ID"]}, Name: {reader["Name"]}, Age: {reader["Age"]}");
    }
}

3. 事务处理

SqlTransaction transaction = SqlServerHelper.BeginTransaction();
try
{
    string updateSql1 = "UPDATE Users SET Age = @Age WHERE Name = @Name";
    SqlParameter[] parameters1 = new SqlParameter[]
    {
        new SqlParameter("@Age", 31),
        new SqlParameter("@Name", "John")
    };
    int affectedRows1 = SqlServerHelper.ExecuteNonQueryWithTransaction(updateSql1, transaction, parameters1);

    string updateSql2 = "UPDATE Users SET Age = @Age WHERE Name = @Name";
    SqlParameter[] parameters2 = new SqlParameter[]
    {
        new SqlParameter("@Age", 26),
        new SqlParameter("@Name", "Alice")
    };
    int affectedRows2 = SqlServerHelper.ExecuteNonQueryWithTransaction(updateSql2, transaction, parameters2);

    SqlServerHelper.CommitTransaction(transaction);
    Console.WriteLine($"事务处理成功,影响行数:{affectedRows1 + affectedRows2}");
}
catch (Exception ex)
{
    SqlServerHelper.RollbackTransaction(transaction);
    Console.WriteLine($"事务处理失败:{ex.Message}");
}

四、SqlServerHelper工具类的优化与扩展

SqlServerHelper工具类可以根据实际需求进行优化和扩展。以下是一些可能的优化和扩展方向:

1. 连接池管理

虽然SqlConnection对象本身支持连接池,但可以通过更精细的管理进一步提高性能。例如,可以限制最大连接数、设置连接超时时间等。

2. 异步操作支持

随着.NET异步编程模型的普及,可以为SqlServerHelper添加异步方法,如ExecuteNonQueryAsync、ExecuteScalarAsync和ExecuteReaderAsync等,以提高应用程序的响应能力。

3. 日志记录

添加日志记录功能,记录数据库操作的执行情况、错误信息等,便于问题排查和性能优化。

4. 多数据库支持

通过抽象基类或接口,将SqlServerHelper扩展为支持多种数据库的工具类,如MySQLHelper、OracleHelper等。

五、总结

本文介绍了一个基于C#的SqlServerHelper工具类,它封装了常用的数据库操作方法,包括连接管理、参数化查询、事务处理等。通过使用SqlServerHelper工具类,可以显著提高开发效率并增强代码的可维护性。同时,本文还讨论了SqlServerHelper工具类的优化与扩展方向,为进一步开发提供了参考。

关键词:C#、.NET、SqlServer、工具类、数据库访问、参数化查询、事务处理

简介:本文详细介绍了基于C#的SqlServerHelper工具类的设计与实现,包括数据库连接管理、参数化查询、事务处理等核心功能。通过使用SqlServerHelper工具类,开发者可以简化SqlServer数据库操作代码,提高开发效率并增强代码的可维护性。同时,文章还讨论了工具类的优化与扩展方向。

《C#访问SqlServer的工具类SqlServerHelper.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档