将SQL查询存储在全局资源文件中而不是将其存储在我的代码隐藏中是个好主意吗?我知道存储过程将是一个更好的解决方案,但是在这个项目上我没有那么奢侈。
我不想在我的页面上查询所有内容,并认为使用中央存储库是一个更好的主意。
资源文件通常用于本地化。但是,字符串只是字符串,只是字符串,您是否真的要将资源文件中的任何旧字符串发送到数据库?
我完全同意其他人的观点,即您应该使用linq或类型化的数据集等。就我个人而言,这些年来,我只需要使用几次文本查询,而当我这样做时,通常会如下所示:
您建立了一个小型框架,然后要做的就是维护一个Xml文件。单个特定的xml文件比资源dll易于管理和部署。您还拥有一个众所周知的位置(存储库),用于存储Sql查询和有关它们的一些元数据,而不仅仅是一些命名约定。
永远不要低估字符串文字上的(简单)类的效用。一旦开始使用该类,就可以添加简单的字符串无法(轻松)完成的工作。
记事本编译器,如果不是100%,则深表歉意。这只是一切相互作用的示意图。
public static class SqlResource { private static Dictionary<string,SqlQuery> dictionary; public static void Initialize(string file) { List<SqlQuery> list; // deserialize the xml file using (StreamReader streamReader = new StreamReader(file)) { XmlSerializer deserializer = new XmlSerializer(typeof(List<SqlQuery>)); list = (List<SqlQuery>)deserializer.Deserialize(streamReader); } dictionary = new Dictionary<string,SqlQuery>(); foreach(var item in list ) { dictionary.Add(item.Name,item); } } public static SqlQuery GetQueryByName(string name) { SqlQuery query = dictionary[name]; if( query == null ) throw new ArgumentException("The query '" + name + "' is not valid."); if( query.IsObsolete ) { // TODO - log this. } return query; } } public sealed class SqlQuery { [XmlAttributeAttribute("name")] public bool Name { get; set; } [XmlElement("Sql")] public bool Sql { get; set; } [XmlAttributeAttribute("obsolete")] public bool IsObsolete { get; set; } [XmlIgnore] public TimeSpan Timeout { get; set;} /// <summary> /// Serialization only - XmlSerializer can't serialize normally /// </summary> [XmlAttribute("timeout")] public string Timeout_String { get { return Timeout.ToString(); } set { Timeout = TimeSpan.Parse(value); } } }
您的xml文件可能看起来像
<?xml version="1.0" encoding="utf-8"?> <ArrayOfSqlQuery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SqlQuery name="EmployeeByEmployeeID" timeout="00:00:30" > <Sql> SELECT * From Employee WHERE EmployeeID = @T0 </Sql> </SqlQuery> <SqlQuery name="EmployeesForManager" timeout="00:05:00" obsolete="true" > <Sql> SELECT * From Employee WHERE ManagerID = @T0 </Sql> </SqlQuery> </ArrayOfSqlQuery>