之前,我问我的问题,我想让你知道我对C#中的winforms很新。 :)所以,我正在尝试使用C#创建一个winform,并且为了从后端获取数据,我将所有SQL查询存储在.txt文件中。在.txt文件中输入SQL查询的格式如下:
// Caption
Query
end
所以,在我的代码中,我开始在循环中读取文件并阅读,直到我得到我需要的标题。有一次,我得到了我的标题,我开始逐行阅读查询,直到我达到“结束”。在我得到查询后,我明确地替换了查询中的变量(因为我知道查询是否有变量)。例如,
// Caption 1
Select * from table_1 where col1 = var1;
end
在这种情况下,我读取查询并使用string.Replace()将“var1”替换为var1.ToString()。然后,执行查询。
我的问题是,有更好的方法吗?比如,是否有更好的格式将查询存储在.txt文件中?任何建议将不胜感激。谢谢。
答案 0 :(得分:6)
警告:我实际上不会这样做,但这是尝试回答这个问题。我的官方立场在底部。
如果我正确地阅读您的问题,您的努力实际上是“解析”文本文件以获得所需的查询。如果是这种情况,我会高度建议不要使用直接text
来完成此任务。 您需要某种结构,以便程序知道“如何”获取适当的信息。 Markup languages基本上是结构化文本,允许程序导航文档。
有许多标记可以使用,这里有一些可以满足您的需求。
.txt
文件中并保持简单,可以尝试使用toml之类的内容,并使用toml.net 进行解析或类似的东西 XmlReader
现在,因为您需要解析数据,所以您应该创建一个存储此信息的模型。
// note this is a JSON example, but you can replace it with whatever Markup parser you like.
public class SqlQueriesFromJsonModel {
public class Query{
public string Caption { get; set; }
public string Query { get; set; }
}
public List<Query> Queries{ get; set; }
}
从这里开始,您希望从文件中读取数据,并将其解析为模型对象。
SqlQueriesFromJsonModel getSqlQueries(){
// grab the file and parse it using json.net
return queriesFromJson;
}
调用方法,并使用所需的查询
// using System.Linq;
var queries = getSqlQueries();
var neededSqlQuery = queries.Where(Query => Query.Caption == "Caption 1");
注意:已经在文本编辑器中写了这个,所以它可能不准确。如果我出错了,我会接受编辑。
现在对于实际的文档格式,这里有几个选项(你实际上不必使用其中任何一个......这只是为了让创意果汁流动)。
json
{
"queries": [
{
"caption": "Caption 1",
"query": "select * from someTable"
},
{
"caption": "Caption 2",
"query": "select * from someOtherTable"
}
]
}
<强> XML 强>
<?xml version="1.0"?>
<queries>
<query caption="Caption 1">select * from someTable</query>
<query caption="Caption 2">select * from someOtherTable</query>
</queries>
<强> toml 强>
title = "SQL Queries"
[Caption 1]
query = "select * from someTable"
[Caption 2]
query = "select * from someOtherTable"
现在已经不在了,我想写一个免责声明,从文件中读取你的查询并不是一个明智的计划。而是编写一个Repository Layer来处理所有需要的查询,并考虑使用ORM来更轻松,更安全地进行布线。
如果您对存储库和ORM不感兴趣,请至少在数据库中的parameterized queries内写Stored Procedures。
无论哪种方式,你应该完全保留文本文件.. imo
答案 1 :(得分:1)
我实际上并不反对这种模式 - 虽然这种情况很不寻常,但它确实有一些好处(我自己也做过类似的事情 - 不应该影响你的意见)。公平地说 - 关于SO(和其他人)的其他所有人都会建议你使用存储过程和/或ORM。这肯定是主流和无意外的方法,你应该在打造自己的道路之前强烈考虑它。
无论哪种方式。你应该注意使用参数而不是string.Replace。 SQL注入是一个非常容易防止的巨大的漏洞 - 它已经没有任何借口了。
如果继续将查询存储在文件中,您可能还需要注意性能并考虑缓存查询而不是每次都访问磁盘。根据您的使用情况,如果文件发生变化,您可能需要处理无效缓存 - 存储过程将为您处理。
我也不同意使用标记语言的意见。如果您要将它们存储在文本文件中,我建议每个文件使用一个查询。它的版本更好,更清晰,并且在大多数情况下也应该提供更好的性能。
如果您不关心运行时编辑或查询的生产调试,您还可以将它们编译为资源文件(通常用于本地化等)。这与Visual Studio相得益彰,相对容易实现,并且是一种常见的方法。
答案 2 :(得分:1)
事实是,有些情况下您不需要存储过程,因为这意味着在您可以使用该功能之前需要一手安装,而另一方面您不希望另一层只是查询直接服务器或数据库统计信息。查询是实际的资源而不是代码的一部分。唯一的问题实际上是存储它的位置,以便它成为应用程序或组件的一部分。因此资源文件实际上并不是一个坏主意。这里唯一要决定的是,是以预定义的格式存储它,还是使用现有的支持代码来管理它或自己编写。
@Chase Florell:也许他正在写一个Repository Layer?
答案 3 :(得分:0)
是否有理由无法使用存储过程将查询保存在数据库中? 这通常是存储查询的最佳方式,因为它将数据库逻辑保存在数据库中。
如果没有,您可以将您的变量列为@varname,并使用addwithvalue来填充具有该值的参数,而不是使用replace()。