65.9K
CodeProject 正在变化。 阅读更多。
Home

用 XML 编写 SQL 查询——一种支持密集型方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (10投票s)

2005 年 8 月 1 日

CPOL

2分钟阅读

viewsIcon

104168

帮助用 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;
    }
}

结束语

这是一种非常简单的支持密集型方法,用于处理类似情况,我想对此方法发表评论

历史

© . All rights reserved.