ResourceManager.GetString возвращает ноль - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь прочитать некоторые файлы .sql, которые я встроил в файл resx с именем SQLUpdateScripts.Все мои файлы в 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....

Iперепробовал много предложений в stackoverflow, но все они возвращают нуль или исключение

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);

Код в SqlUpdateScripts.Designer.cs для каждого файла sql

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 как ноль.

Если я вызвал вручную:

var sqlqueries = SQLUpdateScript.script_0001.Split(new[] { "\nGO", "\ngo" }, StringSplitOptions.RemoveEmptyEntries);

, он работает нормально, но я хочу использовать переменные для имени файла, а не стандартИмя файла

1 Ответ

0 голосов
/ 30 января 2019

Я нашел проблему.Это была ошибка дампа, которую я сделал.Я дал неправильные значения при тестировании в 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, возможно, если есть способ перечислитьвсе ресурсы, а затем просто выберите один.

Если я найду способ, я добавлю его сюда.

...