用 XML 编写 SQL 查询——一种支持密集型方法
帮助用 XML 编写 SQL 以提供更好支持的文章。
引言
在软件行业中提供实时支持并非易事。 当您必须为有缺陷的应用程序提供支持时,体验会变得更糟。 我为这样一个应用程序提供支持大约 3 年了,这段经历让我以这样一种方式设计 SQL,如果可能的话,需要立即修复。 设计目标是
• 我们需要尽量减少支持时间。 也就是说,如果在系统中发现了一个错误,那么必须立即修复/发送给客户。
• 如果可能,无需更改代码即可发送修复
• 如果可能,可以轻松适应缺失的功能
问题
为了实现这些目标,脑海中浮现的基本想法是使用 XML 作为 SQL。 将完整的 SQL 模板存储在 SQL 中似乎是此类应用程序的理想解决方案。 但由于特殊字符的限制,在 XML 中存储复杂的 SQL 是不可能的。 例如,我不能这样做
<QUERIES>
<SQL ID=”GetBookings”>
SELECT BookingID from BOOKING WHERE BOOKINGDATE >= {0}
</SQL>
</QUERIES>
然后我想,如果我能够在 XML 中做到这一点,我的生活会多么轻松。
一旦我确定了结构,剩下的就变得非常容易了。 这种结构有助于我实现目标。
• 它可以减少编译后的代码大小。
• 它使 SQL 代码可读,因为否则我需要进行如此多的字符串连接操作来创建一个 SQL 字符串。
• SQL 调试变得非常容易,因为现在我不需要从 SQL profiler 中获取大型 SQL,然后正确地缩进它来理解它实际上在做什么
• 我现在可以灵活地更新 SQL(连接),而无需实际编译代码
例如,让我们考虑一个基本场景(了解优先级 1 问题意味着什么的支持人员J),我们发布了产品,并且出现了一个优先级 1 问题,即预订状态没有得到处理。
幸运的是,我们立即处理了这种情况。 如何做到?让我们看看解决方案
<QUERIES> <SQL ID=”GetBookings”> <!-- SELECT BookingID from BOOKING B, BOOKING_STATUS BS WHERE B.BOOKINGSTATUSID = BS.BOOKINGSTATUSID AND BOOKINGSTATUSBOOKINGSEARCH = 1 AND BOOKINGDATE >= {0} --> </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 加载到一个字典对象中; 这样做是为了获得最快的查找时间。
下面是使用 SqlManager 类并执行查询的示例客户端代码。
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; } }
结束语
这是一种非常简单的支持密集型方法,用于处理类似情况,我想对此方法发表评论