有没有办法根据函数的调用方式选择在函数中使用哪个类?代码示例最好地解释了我的问题:
我有2个单独的文件来处理每种类型的数据库(SQL,Access)
访问:
public static DataTable Select(string connString, string query, Dictionary<string, object> Parameters = null)
{
DataTable dt = new DataTable();
//Create Query
using (OleDbConnection conn = new OleDbConnection(connString))
using (OleDbCommand cmd = new OleDbCommand(query, conn))
using (OleDbDataAdapter da = new OleDbDataAdapter(cmd))
{
//Add Parameters
if (Parameters != null)
{
foreach (KeyValuePair<string, object> kvp in Parameters)
{
cmd.Parameters.AddWithValue(kvp.Key, kvp.Value);
}
}
//Execute Query
conn.Open();
da.Fill(dt);
return dt;
}
}
SQL:
public static DataTable Select(string connString, string query, Dictionary<string, object> Parameters = null)
{
DataTable dt = new DataTable();
//Create Query
using (SqlConnection conn = new SqlConnection(connString))
using (SqlCommand cmd = new SqlCommand(query, conn))
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
//Add Parameters
if (Parameters != null)
{
foreach (KeyValuePair<string, object> kvp in Parameters)
{
cmd.Parameters.AddWithValue(kvp.Key, kvp.Value);
}
}
//Execute Query
conn.Open();
da.Fill(dt);
return dt;
}
}
请注意,唯一的区别是Connection,Command和Adapter的类型。
有没有办法合并这两个函数,所以我可以传递一个参数来指定使用哪种类型?
答案 0 :(得分:2)
您所要求的称为Double Dispatch。你不需要双重派遣。
public static DataTable Select(DbProviderFactory factory, string connString, string query, Dictionary<string, object> Parameters = null)
{
DataTable dt = new DataTable();
//Create Query
using (DbConnection conn = factory.CreateConnection())
{
conn.ConnectionString = connectionString;
using(DbCommand cmd = conn.CreateCommand())
using(DbDataAdapter da = factory.CreateDataAdapter())
{
cmd.CommandText = query;
da.SelectCommand = cmd;
if (Parameters != null)
{
foreach (KeyValuePair<string, object> kvp in Parameters)
{
DbParameter parameter = cmd.createParameter();
parameter.ParameterName = kvp.Key;
parameter.Value = kvp.Value;
cmd.Parameters.Add(parameter);
}
}
conn.Open();
da.Fill(dt);
return dt;
}
}
}
答案 1 :(得分:0)
要回答您的问题,您可以创建数据库类型的枚举,将其传递到Select
,然后在Select
内,您可以switch
对值进行处理,其中每个案例包含相应的代码。
(但是,这对我来说看起来很糟糕,因为这看起来像是一个使用多态的好机会,至少其中一些你应该已经通过ADO.NET。你可以自己填补空白。)
答案 2 :(得分:0)
您可能需要查看DbProviderFactory方法
http://msdn.microsoft.com/en-us/library/wda6c36e(v=vs.110).aspx