3

我正在尝试建立对我在类库中创建的嵌入式 SQL 资源文件的访问。但是,我不确定从这里去哪里。

我已经使用以下方法访问了资源:

Assembly.GetExcecutingAssembly().GetManifestResourceStream("InsertTest.sql");

我的理解是,有一种以强类型方式访问它们的方法,但我似乎无法掌握项目或解决方案以编程方式浏览它们各自的属性或资源。

我错过了什么?

4

3 回答 3

7

尽管我确实得到了一些很好的建议(请参阅 Philip Daniels 的回答 - 好东西),但它们都没有真正解决我的具体问题。但是,我发现完成此操作的最简单方法是执行以下操作:

  1. 右键单击您的项目并选择“属性”
  2. 选择“资源”选项卡。如有必要,创建一个新的资源文件。
  3. 在左上角有一个默认为“字符串”的下拉菜单。单击此框并选择“文件”。
  4. 拖放要嵌入到项目中的资源文件。

您现在可以使用以下语法访问强类型资源:

Project.Properties.Resources.ResourceName;

在我的情况下,这非常有效,因为我将内联 SQL 存储在这些文件中,并返回嵌入在文件中的 sql。但是请记住,默认情况下,这些资源是链接的而不是嵌入的,但是您可以更改它们的属性以将它们设置为嵌入的。

希望这对某人有帮助!

于 2012-11-14T20:08:51.393 回答
1

您快到了。我有几个用于此的功能。你可以对图像做一些非常相似的事情。我不确定是否值得创建您想要的属性(如果您坚持,可以通过项目属性的“资源”选项卡执行此操作)。

/// <summary>
    /// Gets an open stream on the specified embedded resource. It is the
    /// caller's responsibility to call Dispose() on the stream.
    /// The filename is of the format "folder.folder.filename.ext"
    /// and is case sensitive.
    /// </summary>
    /// <param name="assembly">The assembly from which to retrieve the Stream.</param>
    /// <param name="filename">Filename whose contents you want.</param>
    /// <returns>Stream object.</returns>
    public static Stream GetStream(Assembly assembly, string filename)
    {
        string name = String.Concat(assembly.GetName().Name, ".", filename);
        Stream s = assembly.GetManifestResourceStream(name);
        return s;
    }

    /// <summary>
    /// Get the contents of an embedded file as a string.
    /// The filename is of the format "folder.folder.filename.ext"
    /// and is case sensitive.
    /// </summary>
    /// <param name="assembly">The assembly from which to retrieve the file.</param>
    /// <param name="filename">Filename whose contents you want.</param>
    /// <returns>String object.</returns>
    public static string GetFileAsString(Assembly assembly, string filename)
    {
        using (Stream s = GetStream(assembly, filename))
        using (StreamReader sr = new StreamReader(s))
        {
            string fileContents = sr.ReadToEnd();
            return fileContents;
        }
    }
于 2012-11-14T17:32:22.287 回答
1

在资源文件上,您将无法使用智能感知来构建您的 sql 脚本,以将它们作为项目中的单独文件进行比较。您可以创建一个辅助类来以强类型方式访问它们:

public class Scripts
{
    public static string Sql1
    {
        get
        {
            return GetResource("sql1.sql");
        }
    }

   public static string Sql2
   {
        get
        {
           return GetResource("sql2.sql");
        }
   }

    private static string GetResource(string name)
    {
        var assembly = Assembly.GetExecutingAssembly();
        using(var stream = new StreamReader(assembly.GetManifestResourceStream("Myproject.Sql." + name)))
        {
            return stream.ReadToEnd();
        }
    }
}

例如,在 Dapper 中,您可以像这样访问您的脚本:

using(var db = new SqlConnection("yourconnectionstring")){
    db.Open();
    var results = db.Query(Scripts.Sql1);
} 
于 2016-09-19T15:21:06.737 回答