Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态选择要在函数中使用的类_C#_Class - Fatal编程技术网

C# 动态选择要在函数中使用的类

C# 动态选择要在函数中使用的类,c#,class,C#,Class,有没有一种方法可以根据调用函数的方式来选择在函数中使用哪个类?代码示例最好地解释了我的问题: 我有两个单独的文件来处理每种类型的数据库(SQL、Access) 访问: public static DataTable Select(string connString, string query, Dictionary<string, object> Parameters = null) { DataTable dt = new DataTable();

有没有一种方法可以根据调用函数的方式来选择在函数中使用哪个类?代码示例最好地解释了我的问题:

我有两个单独的文件来处理每种类型的数据库(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;
        }
    }
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;
        }
    }        
}