将我的SQL查询存储在全局资源文件中而不是将其存储在我的代码隐藏中是一个好主意吗?我知道存储过程将是一个更好的解决方案,但我没有这个项目的奢侈品。
我不想在我的页面上查询,并认为中央存储库会更好。
答案 0 :(得分:7)
资源文件通常用于本地化。但是字符串只是一个字符串只是一个字符串,你真的想要将资源文件中的任何旧字符串发送到你的数据库吗?
我完全同意其他人你应该使用linq或类型化的数据集等。我个人多年来只需要多次使用文本查询,当我这样做时,通常类似于以下内容:
您设置了一个小框架,然后您需要做的就是维护一个Xml文件。与资源dll相比,单个特定的xml文件更易于管理和部署。您还有一个众所周知的地方(存储库),它存储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); }
}
}
您的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>
答案 1 :(得分:0)
我会查找带有tableadapters的强类型数据集,并让tableadapters处理所有查询。当你使用它时,你永远不会回去。
只需向解决方案添加数据集,为表添加连接和tableadapter,然后开始构建所有查询(更新,选择,删除,搜索等)并在后面的代码中轻松处理。
答案 2 :(得分:0)
好的,我现在会再次回答,现在我有更多信息。
我会创建一个查询类,它将所有查询字符串保存为共享属性或函数,这些属性或函数可以很好地命名以便于使用。
答案 3 :(得分:0)
我处于相同的情况,一些开发人员更喜欢在资源文件中编写查询。我们使用亚音速,我宁愿使用存储过程,而不是使用直接查询。
一个选项,即使它很糟糕的是将这些查询放在配置文件中并在需要时读取,但这是一个非常糟糕的选择,如果每个人都不能同意使用存储过程,我们可以使用它。
答案 4 :(得分:0)
您也可以使用XML配置文件将名称与存储过程相关联。我正在为当前的C#项目做这件事。 “查询”将定义要调用的过程。
由于某些数据库引擎不支持存储的查询,因此并不总是这样做。
有时对于小项目,可以使用参数化SQL查询(不要连接字符串)。对于select语句尤其如此。
视图也可用于选择而不是存储过程。
罗布