我正在尝试读取一些.sql文件,我已经嵌入到一个名为SQLUpdateScripts的resx文件中。我在SQLupdateScripts.resx中的所有文件都是00001.sql、00002.sql、0003.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);它工作得很好,但我想使用文件名的变量,而不是标准的文件名
发布于 2019-01-31 00:26:38
我找到问题了。这是我犯的一个转储错误。在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资源时避免将来的错误,也许有一种方法可以枚举所有的资源,然后选择一个。
如果我找到一种方法,我会把它添加到这里。
https://stackoverflow.com/questions/54440367
复制相似问题