ASP.NET-在全局资源文件中存储SQL查询?
将SQL查询存储在全局资源文件中而不是将其存储在代码隐藏中是一个好主意吗?我知道存储过程会是一个更好的解决方案,但我在这个项目上没有那么奢侈ASP.NET-在全局资源文件中存储SQL查询?,asp.net,sql,Asp.net,Sql,将SQL查询存储在全局资源文件中而不是将其存储在代码隐藏中是一个好主意吗?我知道存储过程会是一个更好的解决方案,但我在这个项目上没有那么奢侈 我不想让查询遍布我的页面,我认为中央存储库是一个更好的主意。我会使用tableadapters查找强类型数据集,并让tableadapters处理所有查询。当你习惯了它,你就再也回不去了 只需将数据集添加到解决方案中,为表添加连接和tableadapter,然后开始构建所有查询(更新、选择、删除、搜索等),并在代码隐藏中轻松处理即可。好的,我会在获得更多信
我不想让查询遍布我的页面,我认为中央存储库是一个更好的主意。我会使用tableadapters查找强类型数据集,并让tableadapters处理所有查询。当你习惯了它,你就再也回不去了
只需将数据集添加到解决方案中,为表添加连接和tableadapter,然后开始构建所有查询(更新、选择、删除、搜索等),并在代码隐藏中轻松处理即可。好的,我会在获得更多信息后再次尝试回答
我将创建一个查询类,该类将所有查询字符串作为共享属性或函数保存,这些属性或函数可以很好地命名以便于使用。我的情况与一些开发人员相同,他们更喜欢在资源文件中编写查询。我们使用的是亚音速,我更喜欢使用存储过程,而不是直接查询
一种选择是将这些查询放在配置文件中,并在需要时读取,这是一种不好的选择,如果每个人都不同意使用存储过程,我们可以使用它。资源文件通常用于本地化。但是一个字符串就是一个字符串,你真的想把资源文件中的旧字符串发送到你的数据库吗 我完全同意其他人的看法,即您应该使用linq或类型化数据集等。就我个人而言,这些年来,我只需要求助于文本查询几次,而当我这样做时,通常是这样的: 设置一个小框架,然后只需维护一个Xml文件。单个特定的xml文件比资源dll更易于管理和部署。您还有一个众所周知的位置(存储库),它存储Sql查询和有关它们的一些元数据,而不仅仅是一些命名约定 永远不要低估(简单)类对字符串文本的效用。一旦你开始使用这个类,你就可以添加一些你用一个简单的字符串无法(轻松)完成的事情
记事本编译器,所以如果这不是100%,我道歉。这只是一个关于一切如何相互作用的草图
public static class SqlResource
{
private static Dictionary<string,SqlQuery> dictionary;
public static void Initialize(string file)
{
List<SqlQuery> list;
// deserialize the xml file
using (StreamReader streamReader = new StreamReader(file))
{
XmlSerializer deserializer = new XmlSerializer(typeof(List<SqlQuery>));
list = (List<SqlQuery>)deserializer.Deserialize(streamReader);
}
dictionary = new Dictionary<string,SqlQuery>();
foreach(var item in list )
{
dictionary.Add(item.Name,item);
}
}
public static SqlQuery GetQueryByName(string name)
{
SqlQuery query = dictionary[name];
if( query == null )
throw new ArgumentException("The query '" + name + "' is not valid.");
if( query.IsObsolete )
{
// TODO - log this.
}
return query;
}
}
public sealed class SqlQuery
{
[XmlAttributeAttribute("name")]
public bool Name { get; set; }
[XmlElement("Sql")]
public bool Sql { get; set; }
[XmlAttributeAttribute("obsolete")]
public bool IsObsolete { get; set; }
[XmlIgnore]
public TimeSpan Timeout { get; set;}
/// <summary>
/// Serialization only - XmlSerializer can't serialize normally
/// </summary>
[XmlAttribute("timeout")]
public string Timeout_String
{
get { return Timeout.ToString(); }
set { Timeout = TimeSpan.Parse(value); }
}
}
公共静态类SqlResource
{
私有静态字典;
公共静态无效初始化(字符串文件)
{
名单;
//反序列化xml文件
使用(StreamReader StreamReader=新StreamReader(文件))
{
XmlSerializer反序列化器=新的XmlSerializer(typeof(List));
list=(list)反序列化器。反序列化(streamReader);
}
字典=新字典();
foreach(列表中的变量项)
{
dictionary.Add(item.Name,item);
}
}
公共静态SqlQuery GetQueryByName(字符串名称)
{
SqlQuery=字典[名称];
if(查询==null)
抛出新ArgumentException(“查询'+name+''无效。”);
if(query.IsObsolete)
{
//待办事项-记录此事件。
}
返回查询;
}
}
公共密封类SqlQuery
{
[XmlAttributeAttribute(“名称”)]
公共bool名称{get;set;}
[XmlElement(“Sql”)]
公共boolsql{get;set;}
[XmlAttributeAttribute(“过时”)]
公共bool IsObsolete{get;set;}
[XmlIgnore]
公共时间跨度超时{get;set;}
///
///仅序列化-XmlSerializer无法正常序列化
///
[XmlAttribute(“超时”)]
公共字符串超时\u字符串
{
获取{return Timeout.ToString();}
设置{Timeout=TimeSpan.Parse(value);}
}
}
您的xml文件可能看起来像
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSqlQuery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SqlQuery name="EmployeeByEmployeeID" timeout="00:00:30" >
<Sql>
SELECT * From Employee WHERE EmployeeID = @T0
</Sql>
</SqlQuery>
<SqlQuery name="EmployeesForManager" timeout="00:05:00" obsolete="true" >
<Sql>
SELECT * From Employee WHERE ManagerID = @T0
</Sql>
</SqlQuery>
</ArrayOfSqlQuery>
从EmployeeID=@T0的雇员中选择*
从ManagerID=@T0的雇员中选择*
您也可以使用XML配置文件将名称与存储过程关联起来。我正在为一个当前的C#项目做这件事。“查询”将定义要调用的过程
由于某些数据库引擎不支持存储查询,因此这并不总是一个选项
有时对于小型项目,可以使用参数化SQL查询(不要连接字符串)。对于select语句尤其如此
视图也可以用于选择而不是存储过程
Rob我的大部分数据访问都是通过亚音速的,并且是强类型的。然而,我有时需要写出非常复杂的查询。