【问题标题】:Common function to avoid code duplication for handling 2 different type of object避免处理 2 种不同类型对象的代码重复的常用功能
【发布时间】:2016-12-15 07:46:40
【问题描述】:

我正在从 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;
    }
}

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

【问题讨论】:

    标签: c# .net sql-server linq ado.net


    【解决方案1】:

    MySqlConnectionSqlConnection 都继承自 DbConnection。

    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个方法对吗??
    • 非常感谢您的回答,请继续提供帮助。谢谢 :)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2017-10-17
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      相关资源
      最近更新 更多