.net7开发学习:封装一个简单的DAL工具类

发布时间 2023-08-04 16:22:54作者: Xyanzu
之前在工作项目中使用过封装好的sql工具类,感觉很好用,所以根据自己的理解也做了一个mysql的工具类,支持开启事务。
 
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;

namespace com.webdemo01.DAL.Core
{
    public class SqlConnection
    {
        public readonly DbConnection connection;
        private DbTransaction transaction;
        private SqlConnection transConn;
        public SqlConnection(
            string connectionString = "server=;port=;uid=;pwd=;database=",
            string providerName = "MySql.Data.MySqlClient")
        {
            DbProviderFactory factory = null;
            if (providerName == "MySql.Data.MySqlClient")
            {
                factory = MySqlClientFactory.Instance;
            }
            connection = factory.CreateConnection();
            connection.ConnectionString = connectionString;
            connection.Open();
        }
        ~SqlConnection()
        {
            connection.Close();
        }      
        public SqlConnection BeginTransaction(SqlConnection conn)
        {
            transConn = conn;
            transaction = transConn.connection.BeginTransaction();
            return transConn;
        }
        public void Commit()
        {
            transaction.Commit();
        }

        public void Rollback()
        {
            transaction.Rollback();
        }

        public int Execute(string query, params DbParameter[] parameters)
        {
            using (DbCommand command = transConn.connection.CreateCommand())
            {
                command.Transaction = transaction;
                command.CommandText = query;
                command.Parameters.AddRange(parameters);
                return command.ExecuteNonQuery();
            }
        }
        public List<dynamic> Query(string query, params DbParameter[] parameters)
        {
            using (DbCommand command = connection.CreateCommand())
            {
                command.CommandText = query;
                command.Parameters.AddRange(parameters);
                using (DbDataReader reader = command.ExecuteReader())
                {
                    List<dynamic> results = new List<dynamic>();
                    while (reader.Read())
                    {
                        dynamic result = new System.Dynamic.ExpandoObject();
                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            string columnName = reader.GetName(i);
                            object columnValue = reader.GetValue(i);
                            ((IDictionary<string, object>)result).Add(columnName, columnValue);
                        }
                        results.Add(result);
                    }
                    return results;
                }
            }
        }
    }
}