您的位置:首页 > 数据库

定义一个 GlobalSqlConfigHelper 类,实现读取 XML 文件中的 SQL 语句。

2011-12-19 14:22 691 查看
以前在项目中,常常图简单,直接把 SQL 语句写到代码中,比如:

public static void DeleteAllUsers()
{
string sql = "delete from UserInfo";
DBHelper.ExecuteCommand(sql);
}


现在考虑到 SQL 语句硬编码到代码中,不利于维护(PS:sql 语句小改一下就要重新编译源程序),决定把这些 SQL 统一放到一个单独的 XML 文件中。

比如在 App_Data 文件夹下新建一个 GlobalSql.xml 文件,格式如下:

<?xml version="1.0" encoding="utf-8" ?>
<sqls>
<sql key="UserInfoDAL.GetAllValidUsers">
select * from UserInfo where IsValid <> 0
</sql>
<sql key="UserInfoDAL.GetAllMaleValidUsers">
<![CDATA[
select * from UserInfo where IsValid <> 0 and Sex=1
]]>
</sql>
</sqls>


然后在 Web.Config 文件中的 AppSetting 中配置一下这个路径:

<appSettings>
<add key="SqlConfigFilePath" value="\App_Data\sGlobalSql.xml"/>
</appSettings>


个人建议放在 AppData 中,因为放在其他的地方可能被客户端通过 Http 请求来下载,除非你屏蔽对这个文件的请求,额外的工作量,如果你想偷懒的话。

下面是重点了,定义一个 GlobalSqlConfigHelper.cs ,以实现读取 SQL。至于位置,建议不放在 WebUI 和 DAL 层,单独放在一个层中,然后 DAL 层添加对这个层的引用。

下面直接贴代码了:

using System;
using System.Configuration;
using System.Xml;
using System.IO;
using System.Collections.Generic;

namespace LoadXmlSqlFile.Utility
{
public static class GlobalSqlConfigHelper
{
/// <summary>
/// 从配置文件获取 GlobalSql.xml 的路径
/// </summary>
private static readonly string SqlConfigFilePath = AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["SqlConfigFilePath"];

/// <summary>
/// 读取 GlobalSql.xml 中的 sql 集合
/// </summary>
/// <returns></returns>
private static XmlNodeList Read()
{
if (!File.Exists(SqlConfigFilePath))
{
throw new FileNotFoundException(string.Format("GlobalSql.xml 文件 {0} 未找到!", SqlConfigFilePath));
}
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(SqlConfigFilePath);
return xmlDoc.DocumentElement.SelectNodes("sql");
}

private static XmlNodeList _allSqlNodeList;

private static XmlNodeList AllSqlNodeList
{
get
{
if (_allSqlNodeList == null)
{
_allSqlNodeList = Read();
}
return _allSqlNodeList;
}
}

/// <summary>
/// 清除缓存
/// </summary>
public static void ClearCache()
{
_allSqlNodeList = null;
}

/// <summary>
/// 根据 Key 得到对应的 Sql 语句
/// </summary>
/// <param name="key">Sql 语句的 Key</param>
/// <returns></returns>
public static string GetSql(string key)
{
if(string.IsNullOrEmpty(key))
{
throw new ArgumentNullException("key");
}
string result = null;
foreach (XmlNode oneItem in AllSqlNodeList)
{
if(oneItem.Attributes["key"].Value == key)
{
result = oneItem.InnerText;
break;
}
}
if(result == null)
{
throw new KeyNotFoundException(string.Format("GlobalSql.xml 文件中,key 为 {0} 的 SQL 语句未找到!", key));
}
return result;
}
}
}


在 DAL 层添加对这个层的引用后,然后在需要的地方引用命名空间,然后比如:

using System;
using LoadXmlSqlFile.Utility;

namespace LoadXmlSqlFile.WebUI
{
public static class UserInfoDAL
{
public static void GetAllValidUsers()
{
string sql = GlobalSqlConfigHelper.GetSql("UserInfoDAL.GetAllValidUsers");
DBHelper.ExecuteQuery(sql);
}

public static void GetAllMaleValidUsers()
{
string sql = GlobalSqlConfigHelper.GetSql("UserInfoDAL.GetAllMaleValidUsers");
DBHelper.ExecuteQuery(sql);
}
}
}


最后,由于是 Demo ,做得很简单,如果用到项目中,最后实现在 Application_Start 中验证这个 XML 文件是否存在,格式是否正确等等。

谢谢浏览!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐