簡體   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