精简Command版SqlHelper

我在写CSharp程序对数据库进行操作时发现Connection对象起到了连接数据库的做用,实际执行SQL语句使用的是Command对象的方法,所以对SqlHelper进行了重写,具体如下:

一、创建一个ParameterCommand对象,只包含CommandText和Parameters属性,主要用于以事务的方式批量执行SQL语句,我感觉比创建List<string> commandTexts和List<List<DbParameter>> paras两个参数方便,也不容易出错

public class ParameterCommand    {        private List<DbParameter> paras = new List<DbParameter>();        public string CommandText { get; set; }        public List<DbParameter> Parameters        {            get            {                return paras;            }        }    }

二、精简Command版SqlHelper代码如下,传入Command对象做为参数用于执行SQL语句

public static class SqlHelper    {        private static void ResetCommandProperty(DbCommand command, string commandText, params DbParameter[] paras)        {            command.Parameters.Clear();            command.CommandText = commandText;            command.Parameters.AddRange(paras);        }        public static void ExecuteNonQuery(DbCommand command, List<ParameterCommand> paraCommands)        {            command.Transaction = command.Connection.BeginTransaction();            foreach (ParameterCommand paraCommand in paraCommands)            {                try                {                    ResetCommandProperty(command, paraCommand.CommandText,paraCommand.Parameters.ToArray());                    command.ExecuteNonQuery();                }                catch (Exception ex)                {                    command.Transaction.Rollback();                    throw ex;                }            }            command.Transaction.Commit();        }        public static void ExecuteNonQuery(DbCommand command, string commandText, params DbParameter[] paras)        {            ResetCommandProperty(command, commandText, paras);            command.ExecuteNonQuery();        }        public static DbDataReader ExecuteReader(DbCommand command, ParameterCommand paraCommand)        {            ResetCommandProperty(command, paraCommand.CommandText, paraCommand.Parameters.ToArray());            return command.ExecuteReader();        }        public static DbDataReader ExecuteReader(DbCommand command, string commandText, params DbParameter[] paras)        {            ResetCommandProperty(command, commandText, paras);            return command.ExecuteReader();        }        public static object ExecuteScalar(DbCommand command, ParameterCommand paraCommand)        {            ResetCommandProperty(command, paraCommand.CommandText,paraCommand.Parameters.ToArray());            return command.ExecuteScalar();        }        public static object ExecuteScalar(DbCommand command, string commandText, params DbParameter[] paras)        {            ResetCommandProperty(command, commandText, paras);            return command.ExecuteScalar();        }        public static DataTable ExecuteTable(DbCommand command, ParameterCommand paraCommand)        {            return ExecuteTable(command, paraCommand.CommandText, paraCommand.Parameters.ToArray());        }        public static DataTable ExecuteTable(DbCommand command, string commandText, params DbParameter[] paras)        {            DataTable table = new DataTable();            ResetCommandProperty(command, commandText, paras);            using (DbDataAdapter adapter = DbProviderFactories.GetFactory(command.Connection).CreateDataAdapter())            {                adapter.SelectCommand = command;                adapter.Fill(table);            }            return table;        }    }

三、封装的通用DatabaseClient

public abstract class DatabaseClient    {        private DbConnection connection;        public abstract DbConnection GetConnection();        private DbCommand GetCommand()        {            if (connection == null)            {                connection = GetConnection();            }            if (connection.State == ConnectionState.Broken)            {                connection.Close();            }            if (connection.State == ConnectionState.Closed)            {                connection.Open();            }            return connection.CreateCommand();        }        public void ExecuteNonQuery(List<ParameterCommand> paraCommands)        {            using (DbCommand command = GetCommand())            {                SqlHelper.ExecuteNonQuery(command, paraCommands);            }        }        public void ExecuteNonQuery(string commandText, params DbParameter[] paras)        {            using (DbCommand command = GetCommand())            {                SqlHelper.ExecuteNonQuery(command, commandText, paras);            }        }        public DbDataReader ExecuteReader(ParameterCommand paraCommand)        {            using (DbCommand command = GetCommand())            {                return SqlHelper.ExecuteReader(command, paraCommand);            }        }        public DbDataReader ExecuteReader(string commandText, params DbParameter[] paras)        {            using (DbCommand command = GetCommand())            {                return SqlHelper.ExecuteReader(command, commandText, paras);            }        }        public object ExecuteScalar(ParameterCommand paraCommand)        {            using (DbCommand command = GetCommand())            {                return SqlHelper.ExecuteScalar(command, paraCommand);            }        }        public object ExecuteScalar(string commandText, params DbParameter[] paras)        {            using (DbCommand command = GetCommand())            {                return SqlHelper.ExecuteScalar(command, commandText, paras);            }        }        public DataTable ExecuteTable(ParameterCommand paraCommand)        {            using (DbCommand command = GetCommand())            {                return SqlHelper.ExecuteTable(command, paraCommand);            }        }        public DataTable ExecuteTable(string commandText, params DbParameter[] paras)        {            using (DbCommand command = GetCommand())            {                return SqlHelper.ExecuteTable(command, commandText, paras);            }        }    }

四、举个栗子:MySQL版客户端

public class MySqlClient : DatabaseClient    {        private string connectionString;        public MySqlClient(string dataSource, string userName, string password)        {            connectionString = "DataSource=" + dataSource + ";UserName=" + userName + ";Password=" + password + ";Charset=utf8";        }        public MySqlClient(string dataSource, string userName, string password, string database)        {            connectionString = "DataSource=" + dataSource + ";UserName=" + userName + ";Password=" + password + "Database=" + database + ";Charset=utf8";        }        public override System.Data.Common.DbConnection GetConnection()        {            return new MySqlConnection(connectionString);        }    }
(0)

相关推荐

  • async,await执行流看不懂?看完这篇以后再也不会了

    一:案例一 [嵌套下的异步] 写了这么多年的程序,相信大家都知道连接数据库少不了这几个对象,DbConnection,DbCommand,DbDataReader等等..先来看看ContinueWit ...

  • C# 数据操作系列 - 4. 自己实现一个ORM

    0. 前言 在之前的几篇内容中,我们了解了如何通过ADO.NET 访问数据库,如何修改.新增数据.如何通过DataSet和DataAdapter获取数据,我们将在这一篇试试自己实现一个简单的ORM框架 ...

  • 圆运动的实战古方总结!(精简领悟版)

    人身疾病,只分内伤病与外感病(温病应属广义伤寒范畴).内伤病,属形质病,身体圆运动仍在,因形质的损灭必待经年累月,故内伤病皆可慢慢调治:外感病,属本气病,初则一气偶偏.继则一气独胜以至身体运动不圆之病 ...

  • 高考古代文化常识10大版块精简图片版,记起来超方便!

    英语园 专注高中英语教学,资源每日更新, 公众号 " 语文 高考古代文化常识精简版 (建议保存图片,方便背诵) 数学学苑 高中数学学习帮手,我们一起学数学 公众号

  • 《辅行诀》精简整理版!

    一.五行体用化图解 陶隐居曰:此图乃<汤液经法>尽要之妙,学者能谙于此,医道毕矣. 经释: 肝德在散.以辛补之,以酸泻之.肝苦急,急食甘以缓之,适其性而衰之也. 心德在耎.以咸补之,苦泻之 ...

  • office 2016精简激活版

    说到办公软件,大家首先想到的肯定是WPS和Office这两款软件,但无一例外,正常情况我们都需要激活才可以永久使用. 类似的软件已经给朋友安利过了,今天给朋友们分享的是office 2016精简激活版 ...

  • 【圆运动的实战古方总结(精简领悟版)】

    人身疾病,只分内伤病与外感病(温病应属广义伤寒范畴).内伤病,属形质病,身体圆运动仍在,因形质的损灭必待经年累月,故内伤病皆可慢慢调治:外感病,属本气病,初则一气偶偏.继则一气独胜以至身体运动不圆之病 ...

  • 《辅行诀》精简整理版

    一.五行体用化图解           陶隐居曰:此图乃<汤液经法>尽要之妙,学者能谙于此,医道毕矣. 经释: 肝德在散.以辛补之,以酸泻之.肝苦急,急食甘以缓之,适其性而衰之也. 心德在 ...

  • 极速精简 Go 版 Logstash

    hxl Go语言中文网 今天 前言 今天来介绍 go-zero 生态的另一个组件 go-stash.这是一个 logstash 的 Go 语言替代版,我们用 go-stash 相比原先的 logsta ...

  • 自制 Win10x64 Pro.iso 精简稳定版系统分享,完全免费

    自制 Win10x64 Pro.iso 精简稳定版系统分享,完全免费

  • 最新版windows10x64/x32 20H2系统 俄罗斯大神精简纯净版来啦

    最新版windows10x64/x32 20H2系统 俄罗斯大神精简纯净版来啦