C# 用于决定选择哪种SQL查询的设计模式
我正在开发一个Winforms应用程序,其中包含一个连接到SQL Server数据库的连接字符串,并说我有15个不同的查询需要在整个程序中运行,这些查询称为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),然后我的模式—
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容器,你可以修改它,而不是使用单例方法,这样我就更容易测试了。