从.txt文件中读取SQL查询

本文关键字:SQL 查询 读取 txt 文件 | 更新日期: 2023-09-27 18:14:58

在我问问题之前,我想让你知道我对c#中的winforms很陌生。:)所以,我试图使用c#创建一个winform,为了从后端获取数据,我将所有的SQL查询存储在一个。txt文件中。在.txt文件中输入SQL查询的格式如下:

// Caption
Query
end

所以,在我的代码中,我开始在循环中读取文件,直到我得到所需的标题。一旦得到标题,我就开始逐行读取查询,直到到达"end"。在我得到我的查询之后,我显式地替换查询中的变量(因为我知道查询是否有变量)。例如

// Caption 1
Select * from table_1 where col1 = var1;
end

在本例中,我读取查询并使用string.Replace()将"var1"替换为var1. tostring()。然后,执行查询。

我的问题是,有没有更好的方法来做到这一点?例如,是否有更好的格式将查询存储在.txt文件中?任何建议都将不胜感激。谢谢你!

从.txt文件中读取SQL查询

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

如果我没看错你的问题,你的挣扎实际上是"解析"。获取所需查询的文本文件。如果是这种情况,我会强烈建议不要直接使用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");

注意:这是在文本编辑器中编写的,所以可能不准确。如果我写错了,我愿意修改。

现在对于实际的文档格式,这里有几个选项(实际上您不必使用其中任何一个…这只是为了让创意源源不断)。

这些都是"text"格式。

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不感兴趣,至少在数据库的存储过程中编写参数化查询。

无论哪种方式,都应该将文本文件完全排除在外。在我看来

我实际上并不反对这种模式——尽管它很不寻常,但它确实有一些好处(我自己偶尔也做过类似的事情——这并不应该影响你的观点)。公平地说,这里的每个人(以及其他人)都会建议您使用存储过程和/或ORM。这当然是主流的、毫无疑问的方法,你应该在开辟自己的道路之前强烈考虑一下。

。您一定要注意使用参数而不是字符串的建议。取代。SQL注入是一个巨大的漏洞,非常容易被阻止——再也没有借口了。

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

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

如果您不关心运行时编辑或查询的生产调试,您也可以将它们编译成资源文件(通常用于本地化之类的事情)。这在Visual Studio中运行良好,相对容易实现,并且是一种比较常见的方法。

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

@Chase Florell:也许他正在写一个存储库层?

是否存在不能使用存储过程在数据库上保存查询的原因?这通常是存储查询的最佳方式,因为它将数据库逻辑保留在数据库中。

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