代码之家  ›  专栏  ›  技术社区  ›  Learning-Overthinker-Confused

用于避免处理2种不同类型对象的代码重复的通用函数

  •  0
  • Learning-Overthinker-Confused  · 技术社区  · 8 年前

    我从Sql server和mysql数据库中获取表和列,所以我有一些代码重复。

    我希望保留一个公共函数,在处理mysql和sql server连接(打开和关闭)的同时处理连接对象。

    这是我获取Mysql和ms sql表的常用函数 :

    public List<Tables> GetTables(string databaseName, string connectionString, string type)
    {
        var list = new List<Tables>();
        if (type == 'mysql')
        {
            using (MySqlConnection con = new MySqlConnection(connectionString))
            {
                con.Open();
                list = con.GetSchema("Tables").AsEnumerable()
                                  .Select
                                          (
                                              t => new Tables
                                              {
                                                  Name = t["TABLE_SCHEMA"].ToString() + "." + t[2].ToString()
                                              }
                                          ).ToList();
                con.Close();
            }
        }
        else
        {
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                con.Open();
                list = con.GetSchema("Tables").AsEnumerable()
                                 .Select
                                         (
                                             t => new Tables
                                             {
                                                 Name = t["TABLE_SCHEMA"].ToString() + "." + t[2].ToString()
                                             }
                                         ).ToList();
                con.Close();
            }
        }
        return list;
    }
    

    因此,我有上面的代码重复,在获取列的情况下也是如此:

    public List<Columns> GetColumns(string connectionString, string database, string table, string type)
    {
        if (type == 'mysql')
        {
            using (MySqlConnection conn = new MySqlConnection(connectionString))
            {
                con.Open();
                var list = conn.GetSchema("Columns", columnRestrictions).AsEnumerable()
                               .Select
                               (
                                    col => new
                                    {
                                       //column details 
                                    }
                               ).ToList();
                conn.Close();
            }
        }
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();
            if (conn.State == ConnectionState.Open)
            {
                var list = conn.GetSchema("Columns", columnRestrictions).AsEnumerable()
                               .Select
                               (
                                    col => new
                                    {
                                       //column details 
                                    }
                               ).ToList();
                conn.Close();
                return list;
            }
            return null;
        }
    }
    

    因此,任何人都可以指导我如何避免上述代码重复,并保留一个公共函数,该函数将打开和关闭连接,同时处理连接对象,以便我在获取表和列时调用它??

    2 回复  |  直到 8 年前
        1
  •  2
  •   Michael    8 年前

    二者都 MySqlConnection SqlConnection

    public List<Tables> GetTables(string databaseName, string connectionString, string type)
    {
        var connection = connectionFactory.GetConnection(connectionString, type);
    
        return connection.GetTables(connection);
    }
    
    public List<Tables> GetColumns(string databaseName, string connectionString, string type)
    {
        var connection = connectionFactory.GetConnection(connectionString, type);
    
        return connection.GetColumns(connection);
    }
    
    private IEnumerable<Table> GetTables(DbConnection connection)
    {
        connection.Open();
        list = con.GetSchema("Tables").AsEnumerable()
                  .Select(t => new Tables
                  {
                       Name = t["TABLE_SCHEMA"].ToString() + "." + t[2].ToString()
                  }).ToList();
        connection.Close();
     }
    
    private IEnumerable<Table> GetColumns(DbConnection connection)
    {
        connection.Open();
        list = con.GetSchema("COLUMNS").AsEnumerable()
                  .Select(t => new Tables
                  {
                       Name = t["COLUMN_SCHEMA"].ToString() + "." + t[2].ToString()
                  }).ToList();
        connection.Close();
     }
    
    public class ConnectionFactory
    {
         public DbConnection GetConnection(string connectionString, string type)
         {
               switch(type)
               {
                    case "mysql":
                         return new MySqlConnection(connectionString);
                    case "mssql":
                         return new SqlConnection(connectionString);
                    default:
                         throw new UnsupportedException($"{type} not supported.");
               }
    
         }
    }
    

    我假设您在同一个应用程序中需要两个连接,这不仅仅是“以防我需要切换数据库提供程序”。通常,您将为每个数据库类型创建一个实现,并通过接口将其抽象出来。

        2
  •  0
  •   Vitaliy Kalinin    8 年前

    也许您应该将连接的创建封装在一个单独的函数中。