powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Конфигурационный файл для нескольких баз
21 сообщений из 21, страница 1 из 1
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #39844384
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_mПодскажите пжлста, как можно реализовать подход с несколькими средами и наборами конфигураций для них?
Стандартными средствами конфигурации в одном файле - никак. Пишите свою систему конфигурации/настроек.
...
Рейтинг: 0 / 0
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #39844396
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_mНо когда я пример запихиваю в App.config, то система ругается.
Свою - это значит свою. Полностью. Без всяких app.config. Что там будет - XML, JSON, YAML, или БД - дело ваше. Это не такое уж трудное дело.
...
Рейтинг: 0 / 0
Конфигурационный файл для нескольких баз
    #39844397
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, если набор настроек для каждого варианта конфигурации одинаков, то можно сделать свою кастомную реализацию SettingsProvider, и внутри реализации в зависимости от выбранной конфигурации грузить нужные значения. Гуглить по фразе "C# custom SettingsProvider". Один из примеров .
...
Рейтинг: 0 / 0
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #39844452
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныRoust_mПодскажите пжлста, как можно реализовать подход с несколькими средами и наборами конфигураций для них?
Стандартными средствами конфигурации в одном файле - никак. Пишите свою систему конфигурации/настроек.

Можно использовать несколько конфиг файлов, если нужно
...
Рейтинг: 0 / 0
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #39844473
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинСон Веры Павловныпропущено...

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

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

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

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


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

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

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

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

Как из базы читать сертификат? Зависит от того, как вы его туда загружаете и храните.
...
Рейтинг: 0 / 0
Конфигурационный файл для нескольких баз
    #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
Конфигурационный файл для нескольких баз
    #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
21 сообщений из 21, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Конфигурационный файл для нескольких баз
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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