2017-10-21 170 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

嗨,所以你可以得到两个编码员独立到达同一个解决方案的证据 - 就像在科学中一样,你有两个独立的文章在同一个科学杂志的同一个问题上对新的发现也一样说:)个人知道很多这样的出版物 –

相关问题