SqlHelper

撸了个什么垃圾代码~_~!

public class DBContext
    {
        private IDbConnection _dbConnection;
        private string _connectionString;
        public DBContext(IConfiguration Configuration)
        {
            //读取配置文件,数据库连接字符串
            _connectionString = Configuration["ConnectionString"];
        }
        private IDbConnection DbConnection
        {
            get
            {
                if (_dbConnection == null)
                {
                    _dbConnection = new SqlConnection(_connectionString);
                }
                return _dbConnection;
            }
        }
        /// <summary>
        /// 打开连接
        /// </summary>
        private void ConnOpen()
        {
            if (DbConnection.State == ConnectionState.Closed)
            {
                DbConnection.Open();
            }
        }
        /// <summary>
        /// 关闭连接
        /// </summary>
        private void ConnClose()
        {
            // 事务未提交时连接不应该被关闭
            if (Committed && DbConnection.State == ConnectionState.Open)
            {
                DbConnection.Close();
            }
        }
        private IDbTransaction DbTransaction { get; set; }
        /// <summary>
        /// 事务是否已被提交
        /// </summary>
        public bool Committed { get; private set; } = true;
        /// <summary>
        /// 开启事务
        /// </summary>
        public void BeginTransaction()
        {
            Committed = false;
            ConnOpen();
            DbTransaction = DbConnection.BeginTransaction();
        }
        /// <summary>
        /// 事务提交
        /// </summary>
        public void CommitTransaction()
        {
            if (!Committed)
            {
                DbTransaction?.Commit();
                Committed = true;

                DbTransaction?.Dispose();
                ConnClose();
            }
        }

        /// <summary>
        /// 事务回滚
        /// </summary>
        public void RollBackTransaction()
        {
            if (!Committed)
            {
                DbTransaction?.Rollback();
                Committed = true;

                DbTransaction?.Dispose();
                ConnClose();
            }
        }

        private void SetCommand(IDbCommand cmd, string sql, object param)
        {
            cmd.CommandText = sql;
            cmd.Connection = DbConnection;
            cmd.Transaction = DbTransaction;
            cmd.CommandType = CommandType.Text;
            if (param != null)
            {
                Type paramType = param.GetType();
                var props = paramType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

                foreach (var prop in props)
                {
                    object obj = prop.GetValue(param);
                    SqlParameter p = new SqlParameter($"@{prop.Name}", obj ?? DBNull.Value);
                    cmd.Parameters.Add(p);
                }
            }
        }
        // <summary>
        /// 执行Sql 返回受影响的行数
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="param">参数</param>
        /// <returns></returns>
        public int Execute(string sql, object param = null)
        {
            try
            {
                ConnOpen();
                using (IDbCommand cmd = new SqlCommand())
                {
                    SetCommand(cmd, sql, param);
                    return cmd.ExecuteNonQuery();
                }
            }
            finally
            {
                ConnClose();
            }
        }
        public T ExecuteScalar<T>(string sql, object param = null)
        {
            try
            {
                ConnOpen();
                using (IDbCommand cmd = new SqlCommand())
                {
                    SetCommand(cmd, sql, param);
                    object obj = cmd.ExecuteScalar();
                    return Parse<T>(obj);
                }
            }
            finally
            {
                ConnClose();
            }
        }
        public IEnumerable<T> Query<T>(string sql, object param = null)
        {
            try
            {
                ConnOpen();
                using (IDbCommand cmd = new SqlCommand())
                {
                    SetCommand(cmd, sql, param);
                    IDataReader reader = cmd.ExecuteReader();
                    List<T> list = new List<T>();

                    while (reader.Read())
                    {
                        list.Add(Parse<T>(reader));
                    }
                    return list;
                }
            }
            finally
            {
                ConnClose();
            }
        }
        public T QueryFirst<T>(string sql, object param = null)
        {
            try
            {
                ConnOpen();
                using (IDbCommand cmd = new SqlCommand())
                {
                    SetCommand(cmd, sql, param);
                    IDataReader reader = cmd.ExecuteReader();
                    if (reader.Read())
                    {
                        return Parse<T>(reader);
                    }
                    return default(T);
                }
            }
            finally
            {
                ConnClose();
            }
        }

        private static T Parse<T>(IDataReader reader)
        {
            Type type = typeof(T);
            var typeCode = Type.GetTypeCode(type);
            if (typeCode == TypeCode.String || typeCode == TypeCode.Decimal || typeCode == TypeCode.DateTime || type.IsPrimitive || type.IsEnum || Nullable.GetUnderlyingType(type) != null)
            {
                return Parse<T>(reader[0]);
            }
            T obj = Activator.CreateInstance<T>();
            for (int i = 0; i < reader.FieldCount; i++)
            {
                PropertyInfo prop = type.GetProperty(reader.GetName(i), BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                if (prop != null)
                {
                    object value = reader[prop.Name];
                    if (value == null || value is DBNull) continue;
                    value = Parse(prop.PropertyType, value);
                    prop.SetValue(obj, value);
                }
            }
            return obj;
        }
        private static T Parse<T>(object value)
        {
            if (value == null || value is DBNull) return default(T);
            if (value is T) return (T)value;
            var type = typeof(T);
            value = Parse(type, value);
            return (T)value;
        }
        private static object Parse(Type type, object value)
        {
            type = Nullable.GetUnderlyingType(type) ?? type;
            if (type.IsEnum)
            {
                if (value is float || value is double || value is decimal)
                {
                    value = Convert.ChangeType(value, Enum.GetUnderlyingType(type), CultureInfo.InvariantCulture);
                }
                return Enum.ToObject(type, value);
            }
            return Convert.ChangeType(value, type, CultureInfo.InvariantCulture);
        }
    }
View Code

 调用方式

 1 //依赖注入
 2 services.AddScoped<DBContext>();
 3 
 4 //控制器
 5 private DBContext _db;
 6 public ValuesController(DBContext db)
 7 {
 8       _db = db;
 9 }
1011         public IActionResult Get()
12         {
13             try
14             {
15                 _db.BeginTransaction();
16                 int res = _db.Execute("UPDATE [dbo].[Users] SET nickname='transaction update' WHERE Id=@Id", new { Id = 999 });
17                 //throw new Exception("事务回滚");
18                 _db.CommitTransaction();
19             }
20             catch (Exception ex)
21             {
22                 _db.RollBackTransaction();
23             }
24             //int res = _db.Execute("UPDATE [dbo].[Users] SET nickname='update' WHERE Id=@Id", new { Id = 999 });
25             //string email = _db.ExecuteScalar<string>("SELECT email FROM [dbo].[Users] WHERE Id=@Id", new { Id = 999 });
26             //User user = _db.QueryFirst<User>("SELECT * FROM [Users] WHERE id=@id", new { Id = 999 });
27             string name = _db.QueryFirst<string>("SELECT nickName FROM [Users] WHERE id=@id", new { Id = 999 });
28             //int? phoneArea = _db.QueryFirst<int?>("SELECT phoneArea FROM [Users] WHERE id=@id", new { Id = 999 });
29             //IEnumerable<User> users = _db.Query<User>("SELECT top 10 * FROM [Users]");
30             //IEnumerable<int> ids = _db.Query<int>("SELECT top 10 * FROM [Users] WHERE id < @id", new { Id = 11064 });
31             return Ok(name);
32         }

 

posted @ 2019-11-12 16:40  残梦天心  阅读(180)  评论(0编辑  收藏  举报