You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
9.5 KiB

using APP.Utils;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;
namespace APP.Dal
{
public class DbHelper: IDbHelper
{
private SqlConnection _con;
private SqlCommand _cmd;
private SqlDataAdapter _adapter;
private readonly int _connectDBTimeOut = 120;
private static string _connectionString = "";
public DbHelper()
{
_connectionString = AppSettings.Instance.GetConnection(Const.ConnectionString);
}
public async Task<bool> ExecuteNonQuery(string query, List<SqlParameter> parameters, DbHelperEnum type)
{
using (var con = new SqlConnection(_connectionString))
{
using (var cmd = new SqlCommand(query, con))
{
await con.OpenAsync();
cmd.Connection = con;
cmd.CommandType = type == DbHelperEnum.StoredProcedure ? CommandType.StoredProcedure : CommandType.Text;
cmd.CommandText = query;
cmd.CommandTimeout = _connectDBTimeOut;
if (parameters != null)
cmd.Parameters.AddRange(parameters.ToArray());
int result = await cmd.ExecuteNonQueryAsync().ConfigureAwait(false);
con.Dispose();
if (con.State == ConnectionState.Open)
con.Close();
return result > 0;
}
}
}
public async Task<T> ExecuteScalarFunction<T>(string query, List<SqlParameter> parameters, DbHelperEnum type, string outParams)
{
using (var con = new SqlConnection(_connectionString))
{
using (var cmd = new SqlCommand(query, con))
{
await con.OpenAsync();
cmd.Connection = con;
cmd.Parameters.Clear();
cmd.CommandType = type == DbHelperEnum.StoredProcedure ? CommandType.StoredProcedure : CommandType.Text;
cmd.CommandText = query;
cmd.CommandTimeout = _connectDBTimeOut;
if (parameters != null)
cmd.Parameters.AddRange(parameters.ToArray());
SqlParameter returnValue = cmd.Parameters.Add(new SqlParameter(outParams, 0));
returnValue.Direction = ParameterDirection.Output;
await cmd.ExecuteNonQueryAsync();
con.Dispose();
if (con.State == ConnectionState.Open) con.Close();
return (T)returnValue.Value;
}
}
}
public async Task<IEnumerable<T>> ExecuteToTableAsync<T>(string query, List<SqlParameter> parameters, DbHelperEnum type) where T : class
{
try
{
IEnumerable<T> result = new List<T>();
using (var con = new SqlConnection(_connectionString))
{
using (var cmd = new SqlCommand(query, con))
{
Console.WriteLine("Open connecting ......");
var watch = System.Diagnostics.Stopwatch.StartNew();
await con.OpenAsync();
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
Console.WriteLine("Open connected");
cmd.Parameters.Clear();
cmd.CommandType = type == DbHelperEnum.StoredProcedure ? CommandType.StoredProcedure : CommandType.Text;
cmd.CommandTimeout = _connectDBTimeOut;
if (parameters != null) cmd.Parameters.AddRange(parameters.ToArray());
using (SqlDataReader reader = await cmd.ExecuteReaderAsync())
{
if (reader.HasRows)
{
result = await Mapper<T>(reader);
reader.Close();
}
}
if (con.State == ConnectionState.Open) con.Close();
}
}
return result;
}
catch (Exception ex)
{
throw ex;
}
}
#region Private func
public async Task<IList<T>> Mapper<T>(SqlDataReader reader, bool close = true) where T : class
{
try
{
IList<T> entities = new List<T>();
if (reader != null && reader.HasRows)
{
while (await reader.ReadAsync())
{
T item = default(T);
if (item == null)
item = Activator.CreateInstance<T>();
Mapper(reader, item);
entities.Add(item);
}
if (close)
{
reader.Close();
}
}
return entities;
}
catch (Exception ex)
{
throw ex;
}
}
private bool Mapper<T>(IDataRecord reader, T entity) where T : class
{
Type type = typeof(T);
if (entity != null)
{
for (var i = 0; i < reader.FieldCount; i++)
{
var fieldName = reader.GetName(i);
try
{
var propertyInfo = type.GetProperties().FirstOrDefault(info => info.Name.Equals(fieldName, StringComparison.InvariantCultureIgnoreCase));
if (propertyInfo != null)
{
var value = reader[i];
if ((reader[i] != null) && (reader[i] != DBNull.Value))
{
propertyInfo.SetValue(entity, reader[i], null);
}
else
{
if (propertyInfo.PropertyType == typeof(System.DateTime) ||
propertyInfo.PropertyType == typeof(System.DateTime?))
{
propertyInfo.SetValue(entity, System.DateTime.MinValue, null);
}
else if (propertyInfo.PropertyType == typeof(string))
{
propertyInfo.SetValue(entity, string.Empty, null);
}
else if (propertyInfo.PropertyType == typeof(bool) ||
propertyInfo.PropertyType == typeof(bool?))
{
propertyInfo.SetValue(entity, false, null);
}
else if (propertyInfo.PropertyType == typeof(decimal) ||
propertyInfo.PropertyType == typeof(decimal?))
{
propertyInfo.SetValue(entity, decimal.Zero, null);
}
else if (propertyInfo.PropertyType == typeof(double) ||
propertyInfo.PropertyType == typeof(double?))
{
propertyInfo.SetValue(entity, double.Parse("0"), null);
}
else if (propertyInfo.PropertyType == typeof(float) ||
propertyInfo.PropertyType == typeof(float?))
{
propertyInfo.SetValue(entity, 0, null);
}
else if (propertyInfo.PropertyType == typeof(short) ||
propertyInfo.PropertyType == typeof(short?))
{
propertyInfo.SetValue(entity, short.Parse("0"), null);
}
else if (propertyInfo.PropertyType == typeof(long) ||
propertyInfo.PropertyType == typeof(long?))
{
propertyInfo.SetValue(entity, long.Parse("0"), null);
}
else if (propertyInfo.PropertyType == typeof(int) ||
propertyInfo.PropertyType == typeof(int?))
{
propertyInfo.SetValue(entity, int.Parse("0"), null);
}
else
{
propertyInfo.SetValue(entity, 0, null);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
return true;
}
else
{
return false;
}
}
#endregion
}
}