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

时间:2013-05-22 19:09:48

标签: c# sql winforms ado.net

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

4 个答案:

答案 0 :(得分:6)

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

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

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

  1. 如果您尝试将其保存在.txt文件中并保持简单,可以尝试使用toml之类的内容,并使用toml.net 进行解析或类似的东西
  2. 更优选的方法是使用JSON(也是文本),然后使用JSON.NET来解析数据。
  3. 最后,您可以使用XML并使用XmlReader
  4. 解析它

    现在,因为您需要解析数据,所以您应该创建一个存储此信息的模型。

    // 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()。