Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Конфигурационный файл для нескольких баз / 21 сообщений из 21, страница 1 из 1
02.08.2019, 04:09
    #39844367
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Добрый день,

Есть приложение на c#, которое поключается к базе, пишет в нее что-то из файла Excel и завершает работу.

Оно должно работать в разный средах, например: разработка, тренинг и т.д. В начале оно предлагает выбрать юзеру среду или выбрать все, после чего подклюдчиться к выбранной среде или отработать в цикле по все средам.

Я пытаюсь засунуть в App.config что-то вроде такого:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <environments>
      <environment id="1" name="dev" connectionString="Data Source=mydevserver,1433;Initial Catalog=/your database name/>;User id=myUser;Password=myPassword;" folder="c:\dev\" />
      <environment id="2" name="traning" connectionString="Data Source=mytraningserver,1433;Initial Catalog=/your database name/>;User id=myUser;Password=myPassword;" folder="c:\traning\" />
      <environment id="3" name="prod" connectionString="Data Source=myprodserver,1433;Initial Catalog=/your database name/>;User id=myUser;Password=myPassword;" folder="c:\traning\" />
    </environments> 
  </appSettings>
</configuration>


Ругается:
The element 'appSettings' has invalid child element 'environments'. List of possible elements expected: 'add, remove, clear'

Я так понимаю, оно ожидает что-то типа:
Код: xml
1.
2.
3.
4.
    <add key="Instance" value="localhost"/>
    <add key="User" value="myuser"/>
    <add key="Password" value="mypassword"/>
    <add key="FilePath" value="c:\temp\"/>


Но это плоская структура и не позволяет мне получить что я хочу.

Подскажите пжлста, как можно реализовать подход с несколькими средами и наборами конфигураций для них?

Спасибо.
...
Рейтинг: 0 / 0
02.08.2019, 04:20
    #39844370
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Roust_m,

Код: c#
1.
2.
3.
4.
5.
6.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="Test" connectionString="Data Source=.;Initial Catalog=OmidPayamak;Integrated Security=True" providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>
...
Рейтинг: 0 / 0
02.08.2019, 04:35
    #39844372
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Relic HunterRoust_m,

Код: c#
1.
2.
3.
4.
5.
6.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="Test" connectionString="Data Source=.;Initial Catalog=OmidPayamak;Integrated Security=True" providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>



Спасибо, но данный подход не позволяет дополнительных параметров, например:
folder="c:\dev\"
id="1"

Ругается, что "The 'id' attribute not allowed" или "The 'folder' attribute not allowed"
...
Рейтинг: 0 / 0
02.08.2019, 05:16
    #39844377
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Roust_m,

Код: c#
1.
2.
3.
4.
5.
6.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="Test" connectionString="Data Source=.;Initial Catalog=OmidPayamak;Integrated Security=True;folder=c:\dev\" providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>
...
Рейтинг: 0 / 0
02.08.2019, 06:30
    #39844383
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Relic HunterRoust_m,

Код: c#
1.
2.
3.
4.
5.
6.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="Test" connectionString="Data Source=.;Initial Catalog=OmidPayamak;Integrated Security=True;folder=c:\dev\" providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>



Можно конечно и так, но немножко геморно, там помимо папки еще куча параметров и каждый вычленять при запросе несколько неудобно. Я уже начинаю склонятся к тому, чтобы загнать это все в базу и из базы запрашивать.

А можно иметь несколько конфигурационных файлов? И их по циклу проходить?
...
Рейтинг: 0 / 0
02.08.2019, 06:30
    #39844384
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Roust_mПодскажите пжлста, как можно реализовать подход с несколькими средами и наборами конфигураций для них?
Стандартными средствами конфигурации в одном файле - никак. Пишите свою систему конфигурации/настроек.
...
Рейтинг: 0 / 0
02.08.2019, 06:48
    #39844386
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Сон Веры ПавловныRoust_mПодскажите пжлста, как можно реализовать подход с несколькими средами и наборами конфигураций для них?
Стандартными средствами конфигурации в одном файле - никак. Пишите свою систему конфигурации/настроек.

А есть ли в сети какие-нибудь несложные примеры такой конфигурации?

Я пытался использовать этот:
https://www.jokecamp.com/blog/net-custom-configuration-section-collection-and-elements/?fbclid=IwAR0c1CQHSxat3H4NNw0LFGt6u9RQNB_IOGgAy1zavwu1_OGw6WjXFMIa0rQ

Но когда я пример запихиваю в App.config, то система ругается.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="jobSection"
      type="MyConfiguration.JobSection, MyConfiguration" />
  </configSections>
  <jobSection>
    <jobs>
      <job id="1" name="Job Name A" />
      <job id="2" name="Job Name B" />
    </jobs>
  </jobSection>
</configuration>
...
Рейтинг: 0 / 0
02.08.2019, 07:41
    #39844396
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Roust_mНо когда я пример запихиваю в App.config, то система ругается.
Свою - это значит свою. Полностью. Без всяких app.config. Что там будет - XML, JSON, YAML, или БД - дело ваше. Это не такое уж трудное дело.
...
Рейтинг: 0 / 0
02.08.2019, 07:59
    #39844397
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Хотя, если набор настроек для каждого варианта конфигурации одинаков, то можно сделать свою кастомную реализацию SettingsProvider, и внутри реализации в зависимости от выбранной конфигурации грузить нужные значения. Гуглить по фразе "C# custom SettingsProvider". Один из примеров .
...
Рейтинг: 0 / 0
02.08.2019, 09:27
    #39844421
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Сон Веры ПавловныRoust_mНо когда я пример запихиваю в App.config, то система ругается.
Свою - это значит свою. Полностью. Без всяких app.config.
Зачем полностью, человк правильно пошёл в сторону своей секции в файле конфигурации.

App.Config и Custom Configuration Sections

https://docs.microsoft.com/ru-ru/dotnet/api/system.configuration.configurationsection?view=netframework-4.8
...
Рейтинг: 0 / 0
02.08.2019, 09:32
    #39844424
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Сон Веры ПавловныХотя, если набор настроек для каждого варианта конфигурации одинаков, то можно сделать свою кастомную реализацию SettingsProvider, и внутри реализации в зависимости от выбранной конфигурации грузить нужные значения. Гуглить по фразе "C# custom SettingsProvider". Один из примеров .

Спасибо, попробую.

Как вариант, я решил попробовать из локальной базы. Сначала засунул туда конфигурацию:
Код: sql
1.
2.
3.
INSERT INTO [dbo].[appConfigs] ([id] ,[name] ,[status] ,[connection] ,[dbname] ,[username] ,[password] ,[folder] ,[certificate])
SELECT 1 as [id] ,'dev' as [name] ,1 as [status] ,'MyDBDerver,1433;' as [connection] ,'MyDB;' as [dbname],'Myuser' as [username]           ,'MyPassword' as [password] ,'c:\dev\' [folder] ,*
FROM OPENROWSET(BULK N'C:\myfolder\publickey.cer', SINGLE_BLOB) AS [certificate];



Создал процедуру:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE     PROCEDURE [dbo].[uspGetConnection] (@env sysname = NULL)
AS
BEGIN
    SET NOCOUNT ON;
	SELECT [id],[name],[status],[connection],[dbname],[username],[password],[folder],[certificate] FROM [Dump].[dbo].[appConfigs] where name = @env
    SET NOCOUNT OFF;
END;
GO



Сделал класс для чтения параметров соединения:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace Update_column_descriptions
{
    class EnvConnection
    {
        public void GetConnectionSettings(String env)
        {
            //Console.WriteLine("Your env: " + env);
            var connectionString = ConfigurationManager.AppSettings["ConnectionString"];
            string getConnectionSQL = "dbo.uspGetConnection";
            SqlConnection con = new SqlConnection(connectionString);
            SqlCommand cmd = new SqlCommand(getConnectionSQL, con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter param;
            param = cmd.Parameters.Add("@env", SqlDbType.VarChar, 128);
            param.Value = env;

            con.Open();
            var Reader = cmd.ExecuteReader();
            int i = 1;
            string name;
            string status;
            string connection;
            string dbname;
            string username;
            string password;
            string folder;
            string certificate;

            if (Reader.HasRows)
            {
                while (Reader.Read())
                {
                    name = String.Format("{0}", Reader["name"]);
                    status = String.Format("{0}", Reader["status"]);
                    connection = String.Format("{0}", Reader["connection"]);
                    dbname = String.Format("{0}", Reader["dbname"]);
                    username = String.Format("{0}", Reader["username"]);
                    password = String.Format("{0}", Reader["password"]);
                    folder = String.Format("{0}", Reader["folder"]);
                    certificate = String.Format("{0}", Reader["certificate"]);
                    connectionString = "Data Source=" + connection + "Initial Catalog =" + dbname + "User id =" + username + "Password=" + password;
                    Console.WriteLine(name + "," + status + "," + connection + "," + dbname + "," + username + "," + password + "," + folder + "," + certificate);
                    Console.WriteLine(connectionString);
                    SqlConnection conTarget = new SqlConnection(connectionString);

                    i += 1;
                }
            }
            Reader.Close();
            con.Close();
        }
    }
}



Вызываю его:
Код: c#
1.
2.
3.
4.
5.
6.
7.
            string env;
            Console.Write("Enter the environment (dev, traning): ");
            env = Console.ReadLine();
            Console.WriteLine("You have chosen: " + env);

            var getConnection = new EnvConnection();
            getConnection.GetConnectionSettings(env);




Все хорошо, пароли не в текстовом файле, сертификаты не на диске, единственное, о чем я не уверен, правильно ли я читаю сертификат:

Код: c#
1.
2.
3.
string certificate;
...
certificate = String.Format("{0}", Reader["certificate"]);



Это файл, который мне надо будет передать в виде переменной.
...
Рейтинг: 0 / 0
02.08.2019, 09:33
    #39844426
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Roust_mНо когда я пример запихиваю в App.config, то система ругается.
Не достаточно изменить только App.config, необходимо ещё и указанные в примере классы в своё решение добавить и собрать.
И так, чтобы это попало в сборку MyConfiguration и пространство имён MyConfiguration.

https://docs.microsoft.com/en-US/dotnet/framework/configure-apps/file-schema/section-element

typeSpecifies the name of the configuration section handler class that reads the section from the configuration file.
The type value has the syntax "fully-qualified-section-handler-class-name, simple-assembly-name".
The simple assembly name is the root filename without the .dll file extension.
...
Рейтинг: 0 / 0
02.08.2019, 09:39
    #39844431
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Roust_mВсе хорошо, пароли не в текстовом файле, сертификаты не на диске
Хм, вы там свой Vault изобретаете?

Secure, store and tightly control access to tokens, passwords, certificates, encryption keys for protecting secrets and other sensitive data using a UI, CLI, or HTTP API.

https://www.vaultproject.io/
...
Рейтинг: 0 / 0
02.08.2019, 09:50
    #39844444
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Дмитрий МухRoust_mВсе хорошо, пароли не в текстовом файле, сертификаты не на диске
Хм, вы там свой Vault изобретаете?

Secure, store and tightly control access to tokens, passwords, certificates, encryption keys for protecting secrets and other sensitive data using a UI, CLI, or HTTP API.

https://www.vaultproject.io/

От вариантов глаза разбегаются. Тоже посмотрю, спасибо.

Дело в том, что в базе мне несколько проще, я могу больше логики в базу положить и меньше мучиться с моими ограниченными знаниями c#.
...
Рейтинг: 0 / 0
02.08.2019, 10:02
    #39844452
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Сон Веры ПавловныRoust_mПодскажите пжлста, как можно реализовать подход с несколькими средами и наборами конфигураций для них?
Стандартными средствами конфигурации в одном файле - никак. Пишите свою систему конфигурации/настроек.

Можно использовать несколько конфиг файлов, если нужно
...
Рейтинг: 0 / 0
02.08.2019, 10:36
    #39844472
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Roust_mДмитрий Мухпропущено...

Хм, вы там свой Vault изобретаете?

Secure, store and tightly control access to tokens, passwords, certificates, encryption keys for protecting secrets and other sensitive data using a UI, CLI, or HTTP API.

https://www.vaultproject.io/

От вариантов глаза разбегаются. Тоже посмотрю, спасибо.

Дело в том, что в базе мне несколько проще, я могу больше логики в базу положить и меньше мучиться с моими ограниченными знаниями c#.
Вам может и проще, а тем кто будет с этим потом работать?

Вы можете толком описать задачу, что пытаетесь решить? ТЗ есть?
...
Рейтинг: 0 / 0
02.08.2019, 10:37
    #39844473
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Ролг ХупинСон Веры Павловныпропущено...

Стандартными средствами конфигурации в одном файле - никак. Пишите свою систему конфигурации/настроек.

Можно использовать несколько конфиг файлов, если нужно

Потенциально их может быть 50 и больше и их нужно обрабатывать в цикле. Я все больше склоняюсь к хранению конфигурации в базе. Можно иметь сколько угодно конфигураций и сред.

Единственное, не уверен, как из базы читать сертификат.
...
Рейтинг: 0 / 0
02.08.2019, 10:39
    #39844475
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Roust_mЕсть приложение на c#, которое поключается к базе, пишет в нее что-то из файла Excel и завершает работу.
Выглядит так, что вполне достаточно строки подключения к базе.
...
Рейтинг: 0 / 0
02.08.2019, 10:42
    #39844477
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Roust_mРолг Хупинпропущено...


Можно использовать несколько конфиг файлов, если нужно

Потенциально их может быть 50 и больше и их нужно обрабатывать в цикле. Я все больше склоняюсь к хранению конфигурации в базе. Можно иметь сколько угодно конфигураций и сред.

Единственное, не уверен, как из базы читать сертификат.
Можно в базе, можно и в файле, можно и в отдельном сервисе... Зависит от задачи.

Вам удобнее в базе - флаг вам в руки :)

Как из базы читать сертификат? Зависит от того, как вы его туда загружаете и храните.
...
Рейтинг: 0 / 0
05.08.2019, 03:29
    #39845220
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Дмитрий МухRoust_mпропущено...


От вариантов глаза разбегаются. Тоже посмотрю, спасибо.

Дело в том, что в базе мне несколько проще, я могу больше логики в базу положить и меньше мучиться с моими ограниченными знаниями c#.
Вам может и проще, а тем кто будет с этим потом работать?

Вы можете толком описать задачу, что пытаетесь решить? ТЗ есть?

Задач на самом деле две.

Одна, в которой есть около 40-ка (на данный момент, потом будет больше) компаний, у которых бухгалтерия на Xero. У Зеро есть API, который позволяет подключиться к системе используя пару ключей и сертификат. Нужно создать приложение, которое запускается раз в месяц по расписанию, обрабатывает в цикле все эти компании, подключаясь к каждой и экспортирует определенные данные либо в Эксель, либо сразу в базу. С экпортом и туда и туда я разобрался и написал работающие модули. Приложение на данный момент использует один конфигурационный файл, для одной компании.

Вот параметры, которые нужны для подключения:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
{
  "XeroApi": {
    "BaseUrl": "https://api.xero.com",
    "ConsumerKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "ConsumerSecret": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
    "SigningCertPath": "{path-to-signing-cert.pfx}",
    "SigningCertPassword": "{leave blank if your signing cert was created without a password}"
  }
}


Помимо них, нужны параметры для имени компании, папки (или базы/таблицы) куда складывать данные, даты, начиная с которой экпортировать данные. Этот список может расти.

При этом дата, начиная с которой надо экспортировать, может меняться. Допустим в этом месяце им нужно экпортировать данные начиная с начала финансового года, а в другом месяце - абсолютно все. Помимо этого названия таблиц от этого могут меняться.


Другая задача, нужно из базы вытащить схему таблиц в Экселе. Там заполнить вручную описание/предназначение каждого стоблца и таблицы и после этого запихать эти описания обратно в базу в виде extended properties. База может находиться в разных средах (разработка, тест, продакшн) а также могут быть разные базы. Нужно дать пользователю выбрать среду (или сказать что все) и имя базы. После чего приложение должно подключиться куда надо и сделать свое черное дело. С копированием схемы в Эксель и запихиванием описаний обратно я разобрался. Теперь нужно сделать конфигурацию на много баз и сред.
...
Рейтинг: 0 / 0
05.08.2019, 03:32
    #39845221
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конфигурационный файл для нескольких баз
Дмитрий МухКак из базы читать сертификат? Зависит от того, как вы его туда загружаете и храните.

Загружаю вот так:
Код: sql
1.
2.
3.
INSERT INTO [dbo].[appConfigs] ([id] ,[name] ,[status] ,[connection] ,[dbname] ,[username] ,[password] ,[folder] ,[certificate])
SELECT 1 as [id] ,'dev' as [name] ,1 as [status] ,'MyDBDerver,1433;' as [connection] ,'MyDB;' as [dbname],'Myuser' as [username]           ,'MyPassword' as [password] ,'c:\dev\' [folder] ,*
FROM OPENROWSET(BULK N'C:\myfolder\publickey.cer', SINGLE_BLOB) AS [certificate];



Вот определение столбца, в котором сертификат:
Код: sql
1.
[certificate] [varbinary](max) NULL
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Конфигурационный файл для нескольких баз / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]