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 に答える