优化SQL设计以支持错误修复

在支持存在缺陷的应用程序时,经常需要快速定位并修复问题。为这样一个应用程序提供支持已有三年时间,这段经历促使设计了一种SQL策略,以便在可能的情况下立即进行修复。设计的目标是:

  • 最小化支持时间。如果系统中发现了错误,那么必须立即修复或发送给客户。
  • 如果可能的话,修复应该在不更改代码的情况下进行。
  • 如果可能的话,应该能够轻松地添加缺失的功能。

为了实现这些目标,首先想到的是在SQL中使用XML。将完整的SQL模板存储在SQL中似乎是这类应用程序的理想解决方案。但是,由于特殊字符的限制,将复杂的SQL存储在XML中是不可能的。例如,不能这样做:

<QUERIES> <SQL ID="GetBookings"> SELECT BookingID FROM BOOKING WHERE BOOKINGDATE >= {0} </SQL> </QUERIES>

然后思考,如果能够以XML的形式做到这一点,生活会变得多么轻松。一旦确定了结构,其余的事情就会变得非常简单。这种结构帮助实现了目标:

  • 它减少了编译后的代码大小。
  • 它使SQL代码更易于阅读,否则需要进行大量的字符串连接操作来构建一个SQL字符串。
  • SQL调试变得非常容易,因为现在不需要从SQL分析器中提取大型SQL,然后适当地缩进来理解它实际上在做什么。
  • 现在有灵活性在不实际编译代码的情况下更新SQL(连接)。

例如,让来看一个基本场景(支持人员了解什么是优先级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; } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485