2017-10-21 87 views
4

對於學校項目,我不允許使用存儲過程來存儲我的SQL腳本。要解決這個問題,我嘗試在我的類程序集內創建一個SQL_scripts文件夾。讀取嵌入到.NET程序集中的數據

My project structure

現在我卡在如何從一個相對路徑看我的劇本?

這裏是我的嘗試沒有成功:

var appDomain = System.AppDomain.CurrentDomain; 
       var basePath = appDomain.RelativeSearchPath ?? appDomain.BaseDirectory; 
       string path = Path.Combine(basePath, "SQL_scriptes", "GetAllEmptyRoomsAtDateRange.sql"); 
       string query = File.ReadAllText(path); 

但我在下面的文件夾中,我總是:

  • MyProject的\測試\ BIN \調試\ SQL_scriptes \ GetAllEmptyRoomsAtDateRange.sql

有什麼想法?

回答

6

你應該使用SQL代碼添加文件作爲嵌入資源:

enter image description here

,並使用下面的函數從文件中獲取SQL:

public string GetScript(string scriptName) 
{ 
    var assembly = Assembly.GetExecutingAssembly(); 
    var resourceName = "Q46868043.SQL_scripts." + scriptName; 

    using (Stream stream = assembly.GetManifestResourceStream(resourceName)) 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     return reader.ReadToEnd(); 
    } 
} 
1

的尋路是相對的,但您遇到的更大問題是您的文件在編譯時不會被複制,很可能。

轉到visual studio中文件的屬性,並將「複製到輸出目錄」設置爲「始終複製」或「如果更新則複製」。

請記住,這並不意味着文件實際上嵌入到程序集中。有人可以更改文本文件,這會更改腳本。這有好有壞。

如果你想在SQL要建在實際DLL,這是一個不同的過程,你會想看看涉及embedded resources.

1

您在文件系統混亂拼裝結構,文件夾的佈局。這是完全不同的東西。彙編(dll或exe)格式在CLI規範中定義,並且具有PE文件格式,並在編譯源代碼期間創建。您項目中的腳本存儲在文件系統中,除非它們被標記爲項目中的特定操作,即它們將保持原樣。

另一方面,如果將它們標記爲項目屬性中的Embedded.Resource,它們將作爲受管資源存儲在項目組合中,並可以在運行時訪問。但是,在使用.NET時,使用腳本似乎是一種奇怪的方法。

可能的建議是創建靜態字符串或SqlCommand變量併爲其分配SQL查詢。在這種形式下他們不是存儲過程。

基於託管資源的解決方案代碼如下。爲了讓它工作,請添加到您的項目根文件MySqlScripts.sql中,並將其標記爲Embedded.Resource。在這個實現中,默認的項目根名稱空間是「SqlScriptAsAResource」,這反映在嵌入資源的名稱中。相應地更改文件,名稱空間和嵌入的資源名稱。

using System; 
using System.IO; 
using System.Reflection; 

namespace SqlScriptAsAResource 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Assembly myAssembly = Assembly.GetExecutingAssembly(); 
      Stream resStream = myAssembly.GetManifestResourceStream("SqlScriptAsAResource.MySqlScripts.sql"); 
      using(StreamReader reader = new StreamReader(resStream)) 
      { 
       String sqlScript = reader.ReadToEnd(); 
       // Use your SQL script 
      } 
     } 
    } 
} 

基於靜態成員的解決方案是這一個:

using System; 
using System.Data.SqlClient; 

namespace SqlScriptAsAResource 
{ 
    internal static class SqlUtilities 
    { 
     public static readonly String SqlScriptValue = "SELECT * FROM Table1;"; 
     public static readonly SqlCommand Commadn = new SqlCommand("SELECT * FROM Table1;"); 
    } 
} 
+0

你好。我沒有看到你的第一個選項和kmatyaszek之間的區別。對於第二個選項,我使用靜態字符串作爲簡短的SQL腳本。 –

+0

嗨,所以你可以得到兩個編碼員獨立到達同一個解決方案的證據 - 就像在科學中一樣,你有兩個獨立的文章在同一個科學雜誌的同一個問題上對新的發現也一樣說:)個人知道很多這樣的出版物 –

相關問題