繁体   English   中英

从.txt文件中读取SQL查询以获取C#

[英]Reading SQL queries from .txt file for C#

以前,我问我的问题,我想让你知道我对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文件中? 任何建议将不胜感激。 谢谢。

警告 :我实际上不会这样做,但这是试图回答这个问题。 我的官方立场在底部。

如果我正确地阅读您的问题,您的斗争实际上是“解析”文本文件以获得所需的查询。 如果是这种情况,我强烈建议不要使用直接text来完成此任务。 您需要某种结构,以便程序知道“如何”获取适当的信息。 标记语言基本上是结构化文本,允许程序导航文档。

有许多标记可以使用,这里有一些可以满足您的需求。

  1. 如果你试图将它保存在.txt文件中,并保持它非常简单,你可以尝试使用像toml这样的东西 ,并用toml.net 或类似的东西解析它
  2. 更优选的方法是使用JSON (也是文本),然后使用JSON.NET来解析数据。
  3. 最后,您可以使用XML并使用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;
}

调用方法,并使用所需的Query

// 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"

现在已经不在了,我想写一个免责声明,从文件中读取您的查询并不是一个明智的计划。 相反,编写一个存储库层来处理所有需要的查询,并考虑使用ORM使其更容易,更安全。

如果您对存储库和ORM不感兴趣,请在LEAST中在数据库中的存储过程内编写参数化查询

无论哪种方式,你应该完全保留文本文件.. imo

我实际上并不反对这种模式 - 尽管它很不寻常,它确实有一些好处(我有时也做过类似的事情 - 不应该影响你的意见)。 公平地说 - 关于SO(和其他人)的其他所有人都会建议你使用存储过程和/或ORM。 这当然是主流和无意外的方法,你应该在打造自己的道路之前强烈考虑它。

无论哪种方式。 你应该注意使用参数而不是string.Replace。 SQL注入是一个巨大的漏洞,非常容易被阻止 - 它已经没有任何借口了。

如果继续将查询存储在文件中,您可能还需要注意性能并考虑缓存查询而不是每次都访问磁盘。 根据您的使用情况,如果文件发生更改,您可能需要处理无效缓存 - 存储过程将为您处理。

我也不同意使用标记语言的意见。 如果您要将它们存储在文本文件中,我建议每个文件使用一个查询。 它的版本更好,更清晰,并且在大多数情况下也应该提供更好的性能。

如果您不关心运行时编辑或查询的生产调试,您也可以将它们编译为资源文件(通常用于本地化等)。 这与Visual Studio相得益彰,相对容易实现,并且是一种常见的方法。

事实上,有些情况下您不需要存储过程,因为这意味着在您可以使用该功能之前需要一手安装,而另一方面您不希望另一层只是查询直接服务器或数据库统计。 查询是实际的资源而不是代码的一部分。 唯一的问题实际上是存储它的位置,以便它成为应用程序或组件的一部分。 因此资源文件实际上并不是一个坏主意。 这里唯一要决定的是,是以预定义的格式存储它,还是使用现有的支持代码来管理它或编写自己的代码。

@Chase Florell:也许他正在写一个Repository Layer?

您是否有理由无法使用存储过程将查询保存在数据库中? 这通常是存储查询的最佳方式,因为它将数据库逻辑保存在数据库中。

如果不是,您可以将您的变量列为@varname,并使用addwithvalue来填充具有该值的参数,而不是使用replace()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM