C# 动态选择要在函数中使用的类
有没有一种方法可以根据调用函数的方式来选择在函数中使用哪个类?代码示例最好地解释了我的问题: 我有两个单独的文件来处理每种类型的数据库(SQL、Access) 访问:C# 动态选择要在函数中使用的类,c#,class,C#,Class,有没有一种方法可以根据调用函数的方式来选择在函数中使用哪个类?代码示例最好地解释了我的问题: 我有两个单独的文件来处理每种类型的数据库(SQL、Access) 访问: public static DataTable Select(string connString, string query, Dictionary<string, object> Parameters = null) { DataTable dt = new DataTable();
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;
}
}
publicstaticdatatable选择(stringconnstring,stringquery,Dictionary参数=null)
{
DataTable dt=新的DataTable();
//创建查询
使用(OLEDB连接连接=新OLEDB连接(连接字符串))
使用(OleDbCommand cmd=新OleDbCommand(查询,连接))
使用(OleDbDataAdapter da=新的OleDbDataAdapter(cmd))
{
//添加参数
if(参数!=null)
{
foreach(参数中的KeyValuePair kvp)
{
cmd.Parameters.AddWithValue(kvp.Key,kvp.Value);
}
}
//执行查询
conn.Open();
da.填充(dt);
返回dt;
}
}
SQL:
publicstaticdatatable选择(stringconnstring,stringquery,Dictionary参数=null)
{
DataTable dt=新的DataTable();
//创建查询
使用(SqlConnection conn=newsqlconnection(connString))
使用(SqlCommand cmd=newsqlcommand(查询,连接))
使用(SqlDataAdapter da=newsqldataadapter(cmd))
{
//添加参数
if(参数!=null)
{
foreach(参数中的KeyValuePair kvp)
{
cmd.Parameters.AddWithValue(kvp.Key,kvp.Value);
}
}
//执行查询
conn.Open();
da.填充(dt);
返回dt;
}
}
请注意,唯一的区别是连接类型、命令和适配器
有没有办法合并这两个函数,以便我可以传递一个参数来指定要使用的类型?要回答您的问题,您可以创建一个数据库类型的枚举,将其传递到
Select
,然后在Select
中,您可以切换该值,其中每个案例都包含相应的代码
(然而,在我看来,这似乎是一个糟糕的设计,因为这似乎是一个使用多态性的好机会,至少其中一些您应该已经通过ADO.NET获得了。您可以自己填补空白。)您要求的是双重分派。你不需要双重派遣
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;
}
}
}
publicstaticdatatable选择(DbProviderFactory工厂,字符串connString,字符串查询,字典参数=null)
{
DataTable dt=新的DataTable();
//创建查询
使用(DbConnection conn=factory.CreateConnection())
{
conn.ConnectionString=连接字符串;
使用(DbCommand cmd=conn.CreateCommand())
使用(DbDataAdapter da=factory.CreateDataAdapter())
{
cmd.CommandText=查询;
da.SelectCommand=cmd;
if(参数!=null)
{
foreach(参数中的KeyValuePair kvp)
{
DbParameter=cmd.createParameter();
parameter.ParameterName=kvp.Key;
参数.Value=kvp.Value;
cmd.Parameters.Add(参数);
}
}
conn.Open();
da.填充(dt);
返回dt;
}
}
}
您可能需要研究DbProviderFactory方法
实际上还有另一个区别,AddWithValue
在每种情况下都是不同的方法。其中一个是SqlDbParameterCollection.AddWithValue
,另一个是OleDbParameterCollection.AddWithValue
。一般来说,您可能需要通过创建适当的DbParameter
子类型来处理添加到DbParameterCollection
的问题。谢谢,这很有效,我只需要更改参数部分。正确的用法是DbParameter=cmd.createParameter()
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;
}
}
}