C# SqlHelper 帮助类

这个帮助类是一个用于数据库操作的通用类,主要用于执行数据库查询操作并将结果映射为指定类型的对象集合。

SqlHelper 类

  • 功能:执行数据库查询操作并将结果映射为对象集合。

  • 构造函数:接受一个 DbConnectionFactory 实例作为参数,用于创建数据库连接。

  • 方法

    • ExecuteQuery<T>(string query, DbParameter[] parameters):执行数据库查询并将结果映射为类型 T 的对象集合。
  • 备注:这个类实现了通用的数据库查询功能,可以方便地执行查询操作并将结果转换为指定类型的对象集合。

DbConnectionFactory 类

  • 功能:用于创建数据库连接。

  • 构造函数:接受数据库类型和连接字符串作为参数。

  • 方法

    • CreateDbConnection():根据指定的数据库类型和连接字符串创建并返回一个数据库连接对象。
    • CreateDbParameter(string parameterName, object value):根据参数名和值创建并返回一个数据库参数对象。

img

img

img

img

img

using MySql.Data.MySqlClient;
using System;
using System.Data.Common;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 指定数据库类型为 MySql
            var dbType = DatabaseType.MySql;

            // 数据库连接字符串
            var conStr = "server=localhost;user=root;password=123456;database=localdbbase;database=localdb;";

            // 创建 SqlHelper 实例并传入数据库连接工厂
            var sqlHelper = new SqlHelper(new DbConnectionFactory(dbType, conStr));

            // 定义查询语句
            string query = "SELECT * FROM student WHERE Id > @Id";

            // 设置查询参数(防SQL注入)
            DbParameter[] parameters = new DbParameter[]
            {
                sqlHelper.CreateDbParameter("@Id", 2)
            };

            // 执行查询并获取结果
            var students = sqlHelper.ExecuteQuery<Student>(query, parameters);

            // 输出查询结果
            if (students.Count != 0)
            {
                foreach (var student in students)
                {
                    Console.Write($"学生Id:{student.Id} ");
                    Console.WriteLine($"学生姓名:{student.Name}");
                }
            }
            else
            {
                Console.WriteLine("未找到匹配的学生记录。");
            }
        }
    }

    // 学生类,用于映射数据库中的学生表
    public class Student
    {
        public int Id { get; set; } // 学生Id
        public string? Name { get; set; } // 学生姓名
    }
}
using System;
using System.Data;
using System.Data.Common;
using System.Linq;

namespace ConsoleApp1
{
    /// <summary>
    /// Sql帮助类,使用参数化查询
    /// </summary>
    public class SqlHelper
    {
        private readonly DbConnectionFactory _dbConnectionFactory; // 数据库连接工厂

        public SqlHelper(DbConnectionFactory dbConnectionFactory)
        {
            _dbConnectionFactory = dbConnectionFactory;
        }

        /// <summary>
        /// 创建数据库参数
        /// </summary>
        /// <param name="parameterName">参数名称</param>
        /// <param name="value">参数值</param>
        /// <returns>数据库参数对象</returns>
        public DbParameter CreateDbParameter(string parameterName, object value)
        {
            return _dbConnectionFactory.CreateDbParameter(parameterName, value);
        }

        /// <summary>
        /// 执行查询并返回符合条件的所有数据,并将结果转换为指定类型的对象列表
        /// </summary>
        /// <typeparam name="T">要转换的对象类型</typeparam>
        /// <param name="query">查询语句</param>
        /// <param name="parameters">查询参数数组</param>
        /// <returns>符合条件的所有数据转换为指定类型的对象列表</returns>
        public List<T> ExecuteQuery<T>(string query, DbParameter[]? parameters = null) where T : new()
        {
            List<T> results = new List<T>();

            using (DbConnection connection = _dbConnectionFactory.CreateConnection())
            {
                connection.Open();
                using (DbCommand command = connection.CreateCommand())
                {
                    command.CommandText = query;

                    if (parameters != null)
                    {
                        command.Parameters.AddRange(parameters);
                    }

                    using (DbDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            T obj = new T();

                            foreach (var prop in typeof(T).GetProperties())
                            {
                                //if (reader[prop.Name] != DBNull.Value)
                                {
                                    prop.SetValue(obj, Convert.ChangeType(reader[prop.Name], prop.PropertyType));
                                }
                            }

                            results.Add(obj);
                        }
                    }
                }
            }

            return results;
        }



        /// <summary>
        /// 执行非查询SQL语句,返回受影响的行数
        /// </summary>
        /// <param name="query">SQL语句</param>
        /// <param name="parameters">查询参数数组</param>
        /// <returns>受影响的行数</returns>
        public int ExecuteNonQuery(string query, DbParameter[]? parameters = null)
        {
            using (DbConnection connection = _dbConnectionFactory.CreateConnection())
            {
                connection.Open();
                using (DbCommand command = connection.CreateCommand())
                {
                    command.CommandText = query;

                    if (parameters != null)
                    {
                        command.Parameters.AddRange(parameters);
                    }

                    return command.ExecuteNonQuery();
                }
            }
        }
    }
}
using Microsoft.Data.Sqlite;
using MySql.Data.MySqlClient;
using Npgsql;
using Oracle.ManagedDataAccess.Client;
using System;
using System.Data.Common;
using System.Data.SqlClient;

namespace ConsoleApp1
{
    /// <summary>
    /// 数据库类型枚举
    /// </summary>
    public enum DatabaseType
    {
        SqlServer,
        MySql,
        PgSql,
        Oracle,
        Sqlite
    }

    /// <summary>
    /// 数据库连接工厂
    /// </summary>
    public class DbConnectionFactory
    {
        private readonly DatabaseType _dbType; // 数据库类型
        private readonly string _conStr; // 连接字符串

        public DbConnectionFactory(DatabaseType dbType, string conStr)
        {
            _dbType = dbType;
            _conStr = conStr;
        }

        /// <summary>
        /// 创建对应类型的数据库连接
        /// </summary>
        /// <returns>数据库连接对象</returns>
        /// <exception cref="ArgumentException">当数据库类型不受支持时抛出异常</exception>
        public DbConnection CreateConnection()
        {
            DbConnection connection = _dbType switch
            {
                DatabaseType.SqlServer => new SqlConnection(_conStr),
                DatabaseType.MySql => new MySqlConnection(_conStr),
                DatabaseType.PgSql => new NpgsqlConnection(_conStr),
                DatabaseType.Oracle => new OracleConnection(_conStr),
                DatabaseType.Sqlite => new SqliteConnection(_conStr),
                _ => throw new ArgumentException("Unsupported database type")
            };

            return connection;
        }

        /// <summary>
        /// 创建对应类型的数据库参数
        /// </summary>
        /// <param name="parameterName">参数名称</param>
        /// <param name="value">参数值</param>
        /// <returns>数据库参数对象</returns>
        /// <exception cref="ArgumentException">当数据库类型不受支持或参数名称为空时抛出异常</exception>
        public DbParameter CreateDbParameter(string parameterName, object value)
        {
            if (string.IsNullOrWhiteSpace(parameterName))
            {
                throw new ArgumentException("Parameter name cannot be null or empty");
            }

            DbParameter parameter = _dbType switch
            {
                DatabaseType.SqlServer => new SqlParameter(parameterName, value),
                DatabaseType.MySql => new MySqlParameter(parameterName, value),
                DatabaseType.PgSql => new NpgsqlParameter(parameterName, value),
                DatabaseType.Oracle => new OracleParameter(parameterName, value),
                DatabaseType.Sqlite => new SqliteParameter(parameterName, value),
                _ => throw new ArgumentException("Unsupported database type")
            };

            return parameter;
        }
    }
}
posted @ 2024-05-01 08:23  好大的鱼  阅读(43)  评论(0)    收藏  举报