zoukankan      html  css  js  c++  java
  • 精简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);
            }
        }
  • 相关阅读:
    Wine 的安装与解决微信文字不可见,无法聚焦问题。#Wine教程
    Utuntu / CentOS设置环境变量 #java #maven
    真机安装Linux系统 (CentOS与Ubuntu)
    scrollUtils.js #触底触发上拉加载更多 #越线 #上下滚动事件
    微信小程序 bus.js
    svchost.exe占网速的解决办法
    Linux常用的解压缩命令
    本博客标题指示灯代码
    Jenkins持续集成
    jenkins.plugins.publish_over.BapPublisherException: Failed to connect and initialize SSH connection. Message: [Failed to connect session for config [master_server]. Message [Auth fail]]
  • 原文地址:https://www.cnblogs.com/xiaoxianh/p/12093876.html
Copyright © 2011-2022 走看看