以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数、支持多事务提交、支持参数复用、支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展datarow转实体类,也可以搭配dapper.net实现更强大的功能。 /// & ...
以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数、支持多事务提交、支持参数复用、支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展datarow转实体类,也可以搭配dapper.net实现更强大的功能。
/// <summary> /// 通用数据库访问类,支持多种数据库,无直接依赖某个数据库组件 /// 作者:左文俊 /// 日期:2016-6-3 /// </summary> public class DataAccess : IDisposable { private static DbProviderFactory dbProviderFactory = null; private static get='_blank'>string connectionString = null; public static string ConnectionStringName = "default"; private DbConnection dbConnection = null; private DbTransaction dbTransaction = null; private bool useTransaction = false; private bool disposed = false; private bool committed = false; private ParameterHelperClass paramHelper = null; public DataAccess() : this(ConnectionStringName) { } public DataAccess(string cnnStringName) { if (!ConnectionStringName.Equals(cnnStringName, StringComparison.OrdinalIgnoreCase) || dbProviderFactory == null || connectionString == null) { ConnectionStringName = cnnStringName; var cnnStringSection = ConfigurationManager.ConnectionStrings[cnnStringName]; dbProviderFactory = DbProviderFactories.GetFactory(cnnStringSection.ProviderName); connectionString = cnnStringSection.ConnectionString; } paramHelper = new ParameterHelperClass(this); } #region 私有方法 private DbConnection GetDbConnection() { if (dbConnection == null) { dbConnection = dbProviderFactory.CreateConnection(); dbConnection.ConnectionString = connectionString; } if (dbConnection.State == ConnectionState.Closed) { dbConnection.Open(); } if (useTransaction && dbTransaction == null) { dbTransaction = dbConnection.BeginTransaction(); committed = false; } return dbConnection; } private DbCommand BuildDbCommand(string sqlCmdText, CommandType cmdType = CommandType.Text, DbParameter[] parameters = null) { var dbCmd = dbProviderFactory.CreateCommand(); var dbConn = GetDbConnection(); dbCmd.Connection = dbConn; dbCmd.CommandText = sqlCmdText; dbCmd.CommandType = cmdType; if (useTransaction) { dbCmd.Transaction = dbTransaction; } if (parameters != null) { dbCmd.Parameters.AddRange(parameters); } return dbCmd; } private DbCommand BuildDbCommand(string sqlCmdText, CommandType cmdType = CommandType.Text, IDictionary<string, object> paramNameValues = null) { List<DbParameter> parameters = new List<DbParameter>(); if (paramNameValues != null) { foreach (var item in paramNameValues) { parameters.Add(BuildDbParameter(item.Key, item.Value)); } } return BuildDbCommand(sqlCmdText, cmdType, parameters.ToArray()); } private DbCommand BuildDbCommand(string sqlCmdText, CommandType cmdType = CommandType.Text, params object[] paramObjs) { if (paramObjs != null) { if (paramObjs[0] is IDictionary<string, object>) { return BuildDbCommand(sqlCmdText, cmdType, paramObjs[0] as IDictionary<string, object>); } else if (paramObjs is DbParameter[]) { return BuildDbCommand(sqlCmdText, cmdType, paramObjs as DbParameter[]); } else { List<DbParameter> parameters = new List<DbParameter>(); for (int i = 0; i < paramObjs.Length; i++) { parameters.Add(BuildDbParameter("@p" + i.ToString(), paramObjs[0])); } return BuildDbCommand(sqlCmdText, cmdType, parameters.ToArray()); } } else { return BuildDbCommand(sqlCmdText, cmdType, parameters: null); } } private void ClearCommandParameters(DbCommand cmd) { bool canClear = true; if (cmd.Connection != null && cmd.Connection.State != ConnectionState.Open) { foreach (DbParameter commandParameter in cmd.Parameters) { if (commandParameter.Direction != ParameterDirection.Input) { canClear = false; break; } } } if (canClear) { cmd.Parameters.Clear(); } } #endregion #region 公共方法 public void UseTransaction() { useTransaction = true; } public void Commit() { if (dbTransaction != null && useTransaction) { dbTransaction.Commit(); dbTransaction.Dispose(); dbTransaction = null; committed = true; useTransaction = false; } } public DbParameter BuildDbParameter(string name, object value) { DbParameter parameter = dbProviderFactory.CreateParameter(); parameter.ParameterName = name; parameter.Value = value; return parameter; } public DbParameter BuildDbParameter(string name, object value, DbType dbType, ParameterDirection direction = ParameterDirection.Input) { DbParameter parameter = dbProviderFactory.CreateParameter(); parameter.ParameterName = name; parameter.Value = value; parameter.DbType = dbType; parameter.Direction = direction; return parameter; } public DbDataReader ExecuteReader(string sqlCmdText, CommandType cmdType = CommandType.Text, params object[] paramObjs) { var dbCmd = BuildDbCommand(sqlCmdText, cmdType, paramObjs); var dr = dbCmd.ExecuteReader(); ClearCommandParameters(dbCmd); return dr; } public T ExecuteScalar<T>(string sqlCmdText, CommandType cmdType = CommandType.Text, params object[] paramObjs) { T returnValue = default(T); var dbCmd = BuildDbCommand(sqlCmdText, cmdType, paramObjs); object result = dbCmd.ExecuteScalar(); try { returnValue = (T)Convert.ChangeType(result, typeof(T)); } catch { } ClearCommandParameters(dbCmd); return returnValue; } public DataSet ExecuteDataSet(string sqlCmdText, CommandType cmdType = CommandType.Text, params object[] paramObjs) { var dbCmd = BuildDbCommand(sqlCmdText, cmdType, paramObjs); var dbAdapter = dbProviderFactory.CreateDataAdapter(); dbAdapter.SelectCommand = dbCmd; DataSet returnDataSet = new DataSet(); dbAdapter.Fill(returnDataSet); ClearCommandParameters(dbCmd); return returnDataSet; } public DataTable ExecuteDataTable(string sqlCmdText, CommandType cmdType = CommandType.Text, params object[] paramObjs) { DataTable returnTable = new DataTable(); DataSet resultDataSet = ExecuteDataSet(sqlCmdText, cmdType, paramObjs); if (resultDataSet != null && resultDataSet.Tables.Count > 0) { returnTable = resultDataSet.Tables[0]; } return returnTable; } public int ExecuteCommand(string sqlCmdText, CommandType cmdType = CommandType.Text, params object[] paramObjs) { var dbCmd = BuildDbCommand(sqlCmdText, cmdType, paramObjs); int execResult = dbCmd.ExecuteNonQuery(); ClearCommandParameters(dbCmd); return execResult; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } #endregion private void Dispose(bool disposing) { if (!disposed) { if (disposing) { //释放托管资源 } if (dbTransaction != null) { if (!committed) { dbTransaction.Rollback(); } dbTransaction.Dispose(); } if (dbConnection != null) { if (dbConnection.State != ConnectionState.Closed) { dbConnection.Close(); } dbConnection.Dispose(); } disposed = true; } } ~DataAccess() { Dispose(false); } public ParameterHelperClass ParameterHelper { get { return paramHelper; } } public class ParameterHelperClass { private List<DbParameter> parameterList = null; private DataAccess parent = null; public ParameterHelperClass(DataAccess da) { parent = da; parameterList = new List<DbParameter>(); } public ParameterHelperClass AddParameter(string name, object value) { parameterList.Add(parent.BuildDbParameter(name, value)); return this; } public ParameterHelperClass AddParameter(string name, object value, DbType dbType, ParameterDirection direction = ParameterDirection.Input) { parameterList.Add(parent.BuildDbParameter(name, value, dbType, direction)); return this; } public ParameterHelperClass AddParametersWithValue(params object[] paramValues) { for (int i = 0; i < paramValues.Length; i++) { parameterList.Add(parent.BuildDbParameter("@p" + i.ToString(), paramValues[0])); } return this; } public DbParameter[] ToParameterArray() { var paramList = parameterList; parameterList = new List<DbParameter>(); return paramList.ToArray(); } } }
海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com
原标题:DataAccess通用数据库访问类,简单易用,功能强悍
关键词:数据库
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。