Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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# 用于决定选择哪种SQL查询的设计模式_C#_Database_Design Patterns_Connection String_Oledb - Fatal编程技术网

C# 用于决定选择哪种SQL查询的设计模式

C# 用于决定选择哪种SQL查询的设计模式,c#,database,design-patterns,connection-string,oledb,C#,Database,Design Patterns,Connection String,Oledb,我正在开发一个Winforms应用程序,其中包含一个连接到SQL Server数据库的连接字符串,并说我有15个不同的查询需要在整个程序中运行,这些查询称为query1,query2,…query15 我想扩展我的程序的功能,以便用户也可以使用其他数据库类型,如Oracle、MySql和Sqlite。这意味着每种类型的15个查询将有不同的版本 我想在一个地方收集所有查询脚本,这样我的调用方法就可以通过名称引用它们,例如,InsertNewCustomer(string name),然后我的模式—

我正在开发一个Winforms应用程序,其中包含一个连接到SQL Server数据库的连接字符串,并说我有15个不同的查询需要在整个程序中运行,这些查询称为
query1,query2,…query15

我想扩展我的程序的功能,以便用户也可以使用其他数据库类型,如Oracle、MySql和Sqlite。这意味着每种类型的15个查询将有不同的版本

我想在一个地方收集所有查询脚本,这样我的调用方法就可以通过名称引用它们,例如,
InsertNewCustomer(string name)
,然后我的模式—查看我在程序中设置的连接类型,就会运行相应的方法


如何实现这种行为?

我建议您采用工厂模式和策略模式。它所做的是工厂保存策略的所有实例/类型(在本例中是数据库类型)

这里有一个模拟代码供您开始使用

public class DatabaseStrategyFactory
{
    private static DatabaseStrategyFactory _instance;
    private Dictionary<string, Strategy> _collection;

    private DatabaseStrategyFactory()
    {

    }

    // singleton pattern
    public static DatabaseStrategyFactory Instance { get { return _instance ?? (_instance = new DatabaseStrategyFactory()); }}

    public static Initialize()
    {
        // load all strategies either by creating instances or storing the type
        if(_collection == null)
        {
            _collection = new Dictionary<string, Strategy>();
            _collection.Add(*string key either by class name/enum or whatever you want*, instance or type);
        }
    }

    public Strategy GetStrategy(string name)
    {
        if(_collection == null)
            throw new Exception();
        Strategy strategy = null;
        _collection.TryGetValue(name, out strategy);
        return strategy;
    }
}
公共类数据库策略工厂
{
私有静态数据库策略工厂\u实例;
私人字典(藏书),;
私有数据库策略工厂()
{
}
//单态模式
公共静态DatabaseStrategyFactory实例{get{return}\u实例??(\u实例=新DatabaseStrategyFactory());}
公共静态初始化()
{
//通过创建实例或存储类型加载所有策略
if(_collection==null)
{
_集合=新字典();
_添加(*按类名/枚举或任何您想要的*、实例或类型的字符串键);
}
}
公共策略GetStrategy(字符串名称)
{
if(_collection==null)
抛出新异常();
策略=空;
_collection.TryGetValue(名称、输出策略);
回报策略;
}
}

多读一些关于和

@KenWhite是配置文件当前不包含连接字符串。但是这些查询会发生什么呢?Sql Server的插入与MySql的插入不同。我正在寻找一个问题来为我做出决定。是的,我误读了你的问题(不知道怎么读,现在我又读了一遍)。我删除了我的评论以进行清理。谢谢。:-)请你把它说得更具体一点好吗?有了工厂,它可以容纳你类型的所有实例,对吗?如果sql查询是静态的或未更改,则实例可能有一个包含该查询的字符串的私有字段。因此,您可以拥有多个具有特定查询的类,这些查询只在该类上使用。如果你需要更多的解释,请告诉我。另外,如果你有IOC容器,你可以修改它,而不是使用单例方法,这样我就更容易测试了。