c# - 代码重复,相同功能不同类型

标签 c# code-duplication

我有这个方法适用于 Npgsql:

private DataTable GetTableN(string sql, string[] pars)
    {
        NpgsqlCommand zapytanie = new NpgsqlCommand(sql, connn, trann);
        NpgsqlDataAdapter da = new NpgsqlDataAdapter();
        DataSet ds = new DataSet();
        try
        {
            if (pars != null)
            {
                for (int i = 0; i < pars.Length; i++)
                {
                    zapytanie.Parameters.AddWithValue("@param" + i, pars[i]);
                }
            }
            connn.Open();
            da.SelectCommand = zapytanie;
            da.Fill(ds);
            return ds.Tables[0];
        }
        catch (NpgsqlException e)
        {
            throw (new SqlException(e.Message.ToString()));
        }
        finally
        {
            connn.Close();
            zapytanie.Dispose();
            da.Dispose();
            ds.Dispose();
        }
    }

现在我需要使用完全相同的方法,但改用 Odbc。我只需要进行这些更改

  1. NpgsqlCommand 到 ObdcCommand
  2. NpgsqlDataAdapter 到 OdbcDataAdapter
  3. NpgsqlException 到 OdbcException

如何合并它以避免代码重复并且只有一种方法?

最佳答案

您可以尝试更改方法的签名

private DataTable GetTableN(string sql, string[] pars, DbCommand zapytanie, DbDataAdapter da)
{   
    DataSet ds = new DataSet();
    try
    {
        if (pars != null)
        {
            for (int i = 0; i < pars.Length; i++)
            {
                zapytanie.Parameters.AddWithValue("@param" + i, pars[i]);
            }
        }
        connn.Open();
        da.SelectCommand = zapytanie;
        da.Fill(ds);
        return ds.Tables[0];
    }
    catch (DbException e)
    {
        throw (new SqlException(e.Message.ToString()));
    }
    finally
    {
        connn.Close();
        zapytanie.Dispose();
        da.Dispose();
        ds.Dispose();
    }
}

或者使用某种工厂

private DataTable GetTableN(string sql, string[] pars, MyFactory factory)
{
    DbCommand zapytanie = factory.CreateCommand(...);
    DbDataAdapter da = new factory.CreateAdapter(...);
    ...
}

或者你可以为此使用继承

public abstract class MyClass
{
    private DataTable GetTableN(string sql, string[] pars)
    {
        DbCommand zapytanie = CreateCommand();
        DbDataAdapter da = CreateAdapter();
        ...
    }

    protected abstract DbCommand CreateCommand();
    protected abstract DbDataAdapter CreateAdapter();
}

public class OdbcClass : MyClass
{
    protected override DbCommand CreateCommand()
    {
        // create for odbc
    }

    protected override DbDataAdapter CreateAdapter()
    {
        // create for odbc
    }
}

public class PostgrClass : MyClass
{
    protected override DbCommand CreateCommand()
    {
        // create for postgr
    }

    protected override DbDataAdapter CreateAdapter()
    {
        // create for postgr
    }
}

关于c# - 代码重复,相同功能不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38741598/

相关文章:

c# - 如何确保我创建的文件下载是 UTF-8? (而不是没有 BOM 的 UTF-8)

c# - Xamarin.Forms(Android)蓝牙间歇性工作

java - 当值需要不同但方法不需要不同时,方法中会出现代码重复

c# - 一个重构代码如何参与嵌套使用?

c# - FFT问题,输出正确吗?

C# 树节点类设计

java - SonarQube 代码重复检测器是否可以参数化以停止在方法边界上?

c# - 约束失败但记录存在

javascript - 如何防止 jquery 中的代码重复?