Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / App.config / 8 сообщений из 8, страница 1 из 1
28.08.2011, 12:58
    #37415057
rsolanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
App.config
Здравствуйте. Мне необходимо написать код, котрый в конфигурации менял строку подключения к БД (SqlServerCe.3.5)
Код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public bool ChangeDataSourceInConfigValue(string FileName)
        {
            try
            {
                Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                EntityConnectionStringBuilder ECSB = new EntityConnectionStringBuilder(config.ConnectionStrings.ConnectionStrings["MyHomeFinanceEntities"].ConnectionString);
                DbConnectionStringBuilder CSB = new DbConnectionStringBuilder();
                CSB.Add("Data Source", FileName);
                ECSB.ProviderConnectionString = CSB.ConnectionString;
                config.Save();
                return true;
            }
            catch
            {
                return false;
            }
        }
Но по факту, при выполнении этой функции с подстановкой пути к несуществующему файлу БД, все равно приложение работает, отображает данные из первоначального файла БД. Это значит, что путь к новой БД в конфиге не изменился. Что я делаю не так?
...
Рейтинг: 0 / 0
28.08.2011, 13:04
    #37415059
rsolanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
App.config
Изменил код, конфиг стал меняться, но все равно данные берутся из первоначальной БД.
public bool ChangeDataSourceInConfigValue(string FileName)
{
try
{
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
EntityConnectionStringBuilder ECSB = new EntityConnectionStringBuilder(config.ConnectionStrings.ConnectionStrings["MyHomeFinanceEntities"].ConnectionString);
DbConnectionStringBuilder CSB = new DbConnectionStringBuilder();
CSB.Add("Data Source", FileName);
ECSB.ProviderConnectionString = CSB.ConnectionString;
config.ConnectionStrings.ConnectionStrings["MyHomeFinanceEntities"].ConnectionString = ECSB.ProviderConnectionString;
config.Save();
return true;
}
catch
{
return false;
}
}
...
Рейтинг: 0 / 0
28.08.2011, 13:18
    #37415065
rsolanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
App.config
Исправил все ошибки, файл переписывается, но путь к БД при создании ObjectContext не меняется, почему-то только при повторном запуске приложения.
...
Рейтинг: 0 / 0
31.08.2011, 21:42
    #37420062
rsolanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
App.config
Проблему решил следующим образом:
Конструкторы контекста:
Код: plaintext
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.
    public partial class MyHomeFinanceEntities : ObjectContext
    {
        #region Конструкторы
    
        /// <summary>
        /// Инициализирует новый объект MyHomeFinanceEntities, используя строку соединения из раздела "MyHomeFinanceEntities" файла конфигурации приложения.
        /// </summary>
        public MyHomeFinanceEntities() : base("name=MyHomeFinanceEntities", "MyHomeFinanceEntities")
        {
            this.ContextOptions.LazyLoadingEnabled = true;
            OnContextCreated();
        }
    
        /// <summary>
        /// Инициализация нового объекта MyHomeFinanceEntities.
        /// </summary>
        public MyHomeFinanceEntities(string connectionString) : base(connectionString, "MyHomeFinanceEntities")
        {
            this.ContextOptions.LazyLoadingEnabled = true;
            OnContextCreated();
        }
    
        /// <summary>
        /// Инициализация нового объекта MyHomeFinanceEntities.
        /// </summary>
        public MyHomeFinanceEntities(EntityConnection connection) : base(connection, "MyHomeFinanceEntities")
        {
            this.ContextOptions.LazyLoadingEnabled = true;
            OnContextCreated();
        }
...
}
Неработающий код:
Код: plaintext
_Context = new MyHomeFinanceEntities();
Теперь, если явно забирать из конфига строку подключения, то все работает:
Код: plaintext
_Context = new MyHomeFinanceEntities(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).ConnectionStrings.ConnectionStrings["MyHomeFinanceEntities"].ConnectionString);
...
Рейтинг: 0 / 0
04.09.2011, 16:49
    #37424584
DenisRum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
App.config
Можно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
           var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            EntityConnectionStringBuilder builder = new EntityConnectionStringBuilder(config.ConnectionStrings.ConnectionStrings["db"].ConnectionString);
            builder.ProviderConnectionString = connectionString;
            config.ConnectionStrings.ConnectionStrings["db"].ConnectionString = builder.ConnectionString;
            config.Save();
            ConfigurationManager.RefreshSection("connectionStrings");
...
Рейтинг: 0 / 0
08.09.2011, 16:35
    #37431138
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
App.config
DenisRumМожно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
           var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            EntityConnectionStringBuilder builder = new EntityConnectionStringBuilder(config.ConnectionStrings.ConnectionStrings["db"].ConnectionString);
            builder.ProviderConnectionString = connectionString;
            config.ConnectionStrings.ConnectionStrings["db"].ConnectionString = builder.ConnectionString;
            config.Save();
            ConfigurationManager.RefreshSection("connectionStrings");

это не хорошо.
Если кто-нибудь залезет и поменяет строку подключения работающей программы.
Формируйте строку в момент запуск программы и храните в памяти.
Нужно будет покажу, код тривиален.
...
Рейтинг: 0 / 0
08.09.2011, 16:42
    #37431160
rsolanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
App.config
Proga,
Отлично, покажите.
...
Рейтинг: 0 / 0
08.09.2011, 21:36
    #37431674
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
App.config
rsolanovProga,
Отлично, покажите.
Код: plaintext
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.
    public class ConnectionStringState
    {
        static string connectionString;
        static string entityConnectionString;
        public ConnectionStringState()
        {
            if (connectionString==null) SetConnectionStringState();
        }

        public string GetConnectionString() { return connectionString; }
        public string GetEntityConnectionString() { return entityConnectionString; }
        
       
        void SetConnectionStringState()
        {
            using (DataSet ds = new DataSet())
            {
                try
                {
                    ds.ReadXml(String.Format(@"{0}\{1}", Application.StartupPath, Resources.XmlConnectionSettingsFileName), XmlReadMode.Fragment);
                }
          .
          .
foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    if (какая-то проверка)
                    {
                            connectionString = dr["SQLConnectionString"].ToString();
                            entityConnectionString = dr["SQLEntityConnectionString"].ToString();
                            break;
                    }
                }

использование
Код: plaintext
1.
con=new SqlConnection(new ConnectionStringState().GetConnectionString());
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / App.config / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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