我试图建立对我在类库中创建的嵌入式SQL资源文件的访问权限。但是,我不知道从哪里开始。
我使用以下方式访问了资源:
Assembly.GetExcecutingAssembly().GetManifestResourceStream("InsertTest.sql");
我的理解是有一种方式可以以强类型的方式访问它们,但我似乎无法处理项目或解决方案,以编程方式浏览各自的属性或资源。
我错过了什么?
答案 0 :(得分:7)
虽然我确实得到了一些很好的建议(参见菲利普丹尼尔斯的回答 - 很好的东西),但他们都没有真正解决我的具体问题。但是,我发现最简单的方法是执行以下操作:
您现在可以使用以下语法访问强类型资源:
Project.Properties.Resources.ResourceName;
在我的情况下,这完全正常,因为我在这些文件中存储内联SQL,它返回嵌入在文件中的sql。但请注意,默认情况下,这些资源是 已链接 而未嵌入,但您可以更改其属性以将其设置为嵌入。
希望这有助于某人!
答案 1 :(得分: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;
}
}
答案 2 :(得分: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);
}