我正在尝试读取一些嵌入在名为SQLUpdateScripts的resx文件中的.sql文件。我在SQLupdateScripts.resx中的所有文件的格式均为00001.sql,00002.sql,0003.sql等。 我想读取每个sql文件的内容,并基于两个变量
执行它for (int i = DbVersion+1; i <= FileDbVersion; i++)
{
string updateScripts = "script_" + i.ToString("D5");
....
var sqlqueries = myString.Split(new[] { "\nGO", "\ngo" }, StringSplitOptions.RemoveEmptyEntries);
etc....
我在stackoverflow中尝试了很多建议,但是所有建议都返回null或异常
ResourceManager sqLUpdateScripts = new ResourceManager(typeof(SQLUpdateScripts));
string myString = sqLUpdateScripts.GetString(updateScripts);
也
object[] args = new object[] { updateScripts };
SQLUpdateScripts obj = new SQLUpdateScripts();
obj.GetType().InvokeMember(updateScripts,
BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
Type.DefaultBinder, obj, args);
每个SQL文件的SqlUpdateScripts.Designer.cs中的代码是
internal static string script_00001
{
get {
return ResourceManager.GetString("script_00001", resourceCulture);
}
}
internal static string script_00002
{
get {
return ResourceManager.GetString("script_00002", resourceCulture);
}
}
我读到我必须使用反射来调用每个文件作为方法,方法是使用invokeMember,这给我提供了无法找到类SqlUpdateScripts.script_0001'的异常。 当我尝试使用ResourceManager时,只是将myString返回为null。
如果我手动打来电话:
var sqlqueries = SQLUpdateScript.script_0001.Split(new[] { "\nGO", "\ngo" }, StringSplitOptions.RemoveEmptyEntries);
工作正常,但我想使用变量作为文件名而不是标准文件名
答案 0 :(得分:0)
我发现了问题。 这是我犯的一个转储错误。在DBVersion和fileDBVersion中进行测试时,我给出了错误的值,所以当我使用
for (int i = DbVersion+1; i <= FileDbVersion; i++)
不是给我值script_00001,而是给我值script_01001 因此,现在它可以正常工作了,我发现您可以通过两种方式在resx文件中将文件作为字符串调用
第一:
ResourceManager sqLUpdateScripts = new ResourceManager(typeof(SQLUpdateScripts));
string myString = sqLUpdateScripts.GetString(updateScripts);
第二种方式:
string resVal = SQLUpdateScripts.ResourceManager.GetString(updateScripts, Thread.CurrentThread.CurrentCulture);
第二种方法的GetString有两个重载,一个重载没有CultureInfo,一个重载是指定CultureInfo,以防例如您想调用另一种语言。
我不知道在调用错误的resx资源时是否有办法避免将来的错误,也许是否有办法枚举所有资源然后只选择其中一种。
如果我找到方法,请在此处添加。