ResourceManager.GetString返回null

时间:2019-01-30 12:11:20

标签: c# sql embedded-resource

我正在尝试读取一些嵌入在名为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);

工作正常,但我想使用变量作为文件名而不是标准文件名

1 个答案:

答案 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资源时是否有办法避免将来的错误,也许是否有办法枚举所有资源然后只选择其中一种。

如果我找到方法,请在此处添加。