在支持存在缺陷的应用程序时,经常需要快速定位并修复问题。为这样一个应用程序提供支持已有三年时间,这段经历促使设计了一种SQL策略,以便在可能的情况下立即进行修复。设计的目标是:
为了实现这些目标,首先想到的是在SQL中使用XML。将完整的SQL模板存储在SQL中似乎是这类应用程序的理想解决方案。但是,由于特殊字符的限制,将复杂的SQL存储在XML中是不可能的。例如,不能这样做:
<QUERIES>
<SQL ID="GetBookings">
SELECT BookingID
FROM BOOKING WHERE BOOKINGDATE >= {0}
</SQL>
</QUERIES>
然后思考,如果能够以XML的形式做到这一点,生活会变得多么轻松。一旦确定了结构,其余的事情就会变得非常简单。这种结构帮助实现了目标:
例如,让来看一个基本场景(支持人员了解什么是优先级1问题)。发布了产品,一个优先级1的问题出现了,预订状态没有得到妥善处理。幸运的是,立即处理了这个场景。怎么做的,让看看解决方案:
<QUERIES>
<SQL ID="GetBookings">
</SQL>
</QUERIES>
如所见,在条件中引入了新的连接,添加了过滤标准,测试了代码,并立即将更改的XML发送给客户,优先级1的问题得到了解决。
以下是加载XML的示例代码以及使用它的示例客户端。虽然知道这非常简单,许多开发人员可以以更好的形式编写代码。这里的想法只是提供如何实现这种结构的想法。
public class SqlManager {
private StringDictionary Queries;
private static SqlManager sqlManager = null;
protected SqlManager() { }
public static SqlManager Create() {
if (sqlManager == null) {
sqlManager = new SqlManager();
sqlManager.LoadSqlFile();
}
return sqlManager;
}
public void LoadSqlFile() {
string FName = ConfigurationSettings.AppSettings["XMLQuery"];
XmlTextReader qr = new XmlTextReader(FName);
if (Queries == null)
Queries = new StringDictionary();
string id = "";
while (queryXMLReader.Read()) {
switch (queryXMLReader.NodeType) {
case XmlNodeType.Element:
if (qr.Name.Equals("SQL")) {
while (qr.MoveToNextAttribute()) {
if (qr.Name.Equals("ID")) {
id = qr.Value;
break;
}
}
}
break;
case XmlNodeType.Comment:
Queries.Add(id, qr.Value);
id = "";
break;
}
}
}
}
上述代码将XML中存在的所有SQL加载到一个字典对象中;这样做是为了获得最快的查找时间。
Public class BookingSearchAgent {
public static SqlManager QueryManager;
public BookingSearchAgent() {
QueryManager = SqlManager.Create();
}
Public DataSet GetBookingIds() {
string Query = QueryManager.GetQuery("GetBookings");
Query = string.Format(Query, DateTime.Now);
DataSet ds = SqlHelper.ExecuteDataset(CommandType.Text, Query);
Return ds;
}
}