代码重复,相同的功能不同的类型
本文关键字:功能 类型 代码 | 更新日期: 2023-09-27 17:59:51
我有一个可以与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。我只需要做这些改变
- NpgsqlCommand到ObdcCommand
- NpgsqlDataAdapter到OdbcDataAdapter
- 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
}
}
我想工厂模式就是这样。非常感谢。