using Dapper;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
namespace WebAPI.Dapper
{
    public class SqlHelper
    {
        private readonly string _connStr;
        public SqlHelper(string connStr)
        {
            _connStr = connStr;
        }
        IDbConnection GetConnection()
        {
            IDbConnection db = new SqlConnection(_connStr);
            db.Open();
            return db;
        }
        /// 
        /// 获取一个值,param可以是SQL参数也可以是匿名对象
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public T GetValue(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null)
        {
            using (var connection = GetConnection())
            {
                return connection.ExecuteScalar(sql, param, null, commandTimeout, commandType);
            }
        }
        /// 
        /// 事务执行
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public int Trans(string sql1, string sql2, object obj1, object obj2)
        {
            using (var connection = GetConnection())
            {
                IDbTransaction transaction = connection.BeginTransaction();
                try
                {
                    connection.Execute(sql1, obj1);
                    connection.Execute(sql2, obj2);
                    transaction.Commit();
                    return 1;
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    return -1;
                }
            }
        }
        /// 
        /// 获取一个数据模型实体类,param可以是SQL参数也可以是匿名对象
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public T GetModel(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null)
        {
            using (var connection = GetConnection())
            {
                return connection.QueryFirstOrDefault(sql, param, null, commandTimeout, commandType);
            }
        }
        public int GetExecuteScalar(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null)
        {
            using (var connection = GetConnection())
            {
                var result = connection.ExecuteScalar(sql, param, null, commandTimeout, commandType);
                return result;
            }
        }
        /// 
        /// 获取符合条件的所有数据模型实体类列表,param可以是SQL参数也可以是匿名对象
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public List GetModelList(string sql, object param = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) where T : class
        {
            using (var connection = GetConnection())
            {
                return connection.Query(sql, param, null, buffered, commandTimeout, commandType).AsList();
            }
        }
        /// 
        /// 获取符合条件的所有指定返回结果对象的列表(复合对象【如:1对多,1对1】),param可以是SQL参数也可以是匿名对象
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public List GetMultModelList(string sql, Type[] types, Func