Как программно изменить assemblyBinding в app.config?

Я изменил имена столбцов в вашей таблице с «CHILD» и «PARENT» на «ID» и «PARENT_ID» соответственно, чтобы быть немного менее запутанным.

В любом случае, вам нужно использовать CONNECT_BY_ROOT(parent_id) , чтобы получить то, что показывается как «РОДИТЕЛЯ» в желаемом выходе. Если вам не важен порядок строк в вашем результате, это просто:

SELECT connect_by_root(parent_id) "PARENT", id "CHILD"
FROM   table1
WHERE  connect_by_root(parent_id) is not null
CONNECT BY parent_id = prior id

Если вы заботитесь о порядке строк, это становится сложнее. Вам нужно проверить глубину каждого узла в дереве и использовать это для упорядочения результатов. Это будет:

with hier as ( 
SELECT connect_by_root(parent_id) root_id, id, level, 
       case when connect_by_root(parent_id) is null then level else null end root_depth
FROM   table1
CONNECT BY parent_id = prior id
)
select h1.root_id "PARENT", h1.id "CHILD"
from hier h1 inner join hier h2 on h2.root_id is null and h2.id = h1.root_id
order by h2.root_depth, h1.root_id, h1.id

Вот полный пример с тестовыми данными:

WITH table1 ( id, parent_id ) AS
( SELECT 'A', null FROM DUAL UNION ALL
  SELECT 'A1', 'A' FROM DUAL UNION ALL
  SELECT 'A2', 'A' FROM DUAL UNION ALL
  SELECT 'A3', 'A' FROM DUAL UNION ALL
  SELECT 'A11', 'A1' FROM DUAL UNION ALL
  SELECT 'A12', 'A1' FROM DUAL UNION ALL
  SELECT 'A21', 'A2' FROM DUAL UNION ALL
  SELECT 'A121', 'A12' FROM DUAL UNION ALL
  SELECT 'A122', 'A12' FROM DUAL ),
-- Solution begins here 
hier as ( 
SELECT connect_by_root(parent_id) root_id, id, level lvl, 
       case when connect_by_root(parent_id) is null then level else null end root_depth
FROM   table1
CONNECT BY parent_id = prior id
)
select h1.root_id "PARENT", h1.id "CHILD", h2.*
from hier h1 inner join hier h2 on h2.root_id is null and h2.id = h1.root_id
order by h2.root_depth, h1.root_id, h1.lvl, h1.id
+--------+-------+
| PARENT | CHILD |
+--------+-------+
| A      | A1    |
| A      | A2    |
| A      | A3    |
| A      | A11   |
| A      | A12   |
| A      | A21   |
| A      | A121  |
| A      | A122  |
| A1     | A11   |
| A1     | A12   |
| A1     | A121  |
| A1     | A122  |
| A2     | A21   |
| A12    | A121  |
| A12    | A122  |
+--------+-------+
10
задан Cœur 21 January 2019 в 09:27
поделиться

3 ответа

Я нашел то, что мне было нужно. XmlNamespaceManager необходим, поскольку узел assemblyBinding содержит атрибут xmlns. Я изменил код, чтобы использовать его, и он работает:

    private void SetRuntimeBinding(string path, string value)
    {
        XmlDocument doc = new XmlDocument();

        try
        {
            doc.Load(Path.Combine(path, "MyApp.exe.config"));
        }
        catch (FileNotFoundException)
        {
            return;
        }

        XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
        manager.AddNamespace("bindings", "urn:schemas-microsoft-com:asm.v1");

        XmlNode root = doc.DocumentElement;

        XmlNode node = root.SelectSingleNode("//bindings:bindingRedirect", manager);

        if (node == null)
        {
            throw (new Exception("Invalid Configuration File"));
        }

        node = node.SelectSingleNode("@newVersion");

        if (node == null)
        {
            throw (new Exception("Invalid Configuration File"));
        }

        node.Value = value;

        doc.Save(Path.Combine(path, "MyApp.exe.config"));
    }
10
ответ дан 3 December 2019 в 21:23
поделиться

Мне кажется, правильный синтаксис Xpath:

/ configuration / runtime / assemblyBinding / pendentAssembly / bindingRedirect @ newVersion

(у вас слишком много косой черты).

Или если это не работает, вы можете выбрать элемент bindingRedirect (используя SelectSingleNode):

/ configuration / runtime / assemblyBinding /pendentAssembly / bindingRedirect

Затем изменить атрибут newVersion этого элемента.

-1
ответ дан 3 December 2019 в 21:23
поделиться

Похоже, у вас есть настройка файла конфигурации, но я подумал, что вам все еще может быть интересно, как настроить перенаправления привязки во время выполнения. Ключ в том, чтобы использовать событие AppDomain.AssemblyResolve , а подробности приведены в этом ответе . Я предпочитаю использовать его, а не файл конфигурации, потому что мое сравнение номеров версий может быть немного более сложным, и мне не нужно настраивать файл конфигурации во время каждой сборки.

8
ответ дан 3 December 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: