Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Переиначить путь к базе данных


Автор: Softaz 8.6.2006, 10:59
Когда в VS2005 создается типизированный DataSet, то одним из шагов является задание строки подключения, которая хранится в Properties.Settings.settings
"Берется" она от туда из автоматически сгенерированного студией кода, так что править этот код "вручную" - не выход.
Как я понял, значения Settings только для чтения и изменять их в RunTime нельзя.

А если я хочу изменить путь к базе, не перекомпилируя приложение? Как это сделать?
Заранее спасибо. 

Автор: -ser- 9.6.2006, 05:16
понятное дело что на этапе создания типизированного DS студии надо конкретные параметры БД. 
а что тебе мешает написать в конфигурационный XML-файл (в тот же .exe.config) строку подключения, и при запуске приложения читать ее.
Код

conn.ConnectionString = ConfigurationSettings.AppSettings["MyDBConnection"];

 

Автор: Softaz 9.6.2006, 08:11
Код

conn.ConnectionString = ConfigurationSettings.AppSettings["MyDBConnection"];


Какой conn??? он же создает такой код:

Код

        private void InitConnection() {
            this._connection = new System.Data.OleDb.OleDbConnection();
            this._connection.ConnectionString = global::WindowsApplication1.Properties.Settings.Default.NIX3WConnectionString;
        }


И из других файлов я не нашел способа его изменить (если, конечно, public'ком не сделать). Вот в этом и вопрос. 

Автор: Wanderer2019 9.6.2006, 09:37
Хранение информации в отдельном файле... как, например, в конфигурационном XML-нике описывается 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vboriintroductiontoapplicationsettingstorage.asp  

Автор: Softaz 9.6.2006, 17:42
Цитата(Wanderer2019 @  9.6.2006,  09:37 Найти цитируемый пост)
Хранение информации в отдельном файле... как, например, в конфигурационном XML-нике описывается 
здесь  


Епрст. Спасибо, конечно. Однако я знаю КАК ХРАНИТЬ. Проблема в другом.
Вот этот код:
Код

        private void InitConnection() {    
            this._connection = new System.Data.OleDb.OleDbConnection();    
            this._connection.ConnectionString = global::WindowsApplication1.Properties.Settings.Default.NIX3WConnectionString;    
        }

делает VisualStudio2005  и помечает как auto-generated, так что править его вручную нельзя.
Сама переменная _connection помечена как private, так что доступа из другого класса нет.
InitConnection() - тоже, как видно из кода.
Создание нового экземпляра класса и присвоение Connection строки подключения - тоже не выход.
Вы меня понимать?

Добавлено @ 17:45 
Мне нужно в _connection записать
что-то вроде 

Код

this._connection.ConnectionString = "Динамическая строка подключения";

Вместо созданного студией
Код

            this._connection.ConnectionString = global::WindowsApplication1.Properties.Settings.Default.NIX3WConnectionString;     

 

Автор: Softaz 9.6.2006, 18:56
Всем спасибо. Вопрос решен.

Заинтересовался, а что это в строке подключения за |DataDirectory|. Нашел в MSDN
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_fxdeploy/html/be5cbe12-6cb6-49c9-aa59-a1624e1eef3d.htm

After your application has these permissions, it can access the Data Directory by using method calls on classes within the System.IO. You can obtain the path of the Data Directory within a Windows Forms application by using the GetData method to retrieve the value of the DataDirectory variable. This value is also available using the DataDirectory property defined on the CurrentDeployment property of ApplicationDeployment. You can also obtain the data directory path using the relevant variables on the Application class, such as LocalUserAppDataPath. 

И родился такой код:
Код

string BasePath = string.Empty;
//здесь узнаем, откуда приложение запущено и добавляем к пути каталог с файлом БД (находится "внутри" каталога с приложением)
BasePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "path_to_file");
AppDomain.CurrentDomain.SetData("DataDirectory", BasePath);
//С этого момента путь к БД изменен
 

Автор: Хоббит 29.6.2006, 17:02
а я ручками поменял в Settings и все ... если ты dataset создал и не трогает, то и код повторно не генериться 

Автор: rulon 29.6.2006, 17:15

 Если есть датасет, сгенерированный автоматически, значит должен быть биндинг навигатор и дата грид виев =)) ,
и ещё рядышком где то валяется табле адаптер, если это так - тогда можно сделать след. образом, как поступил когда то я:


// передаём информацию о подключении в форму реадктирования
// информации о диллерах
    DillerEditForm.main_infoTableAdapter.Connection.ConnectionString = this.ConnectionString;
    DillerEditForm.skidka_infoTableAdapter.Connection.ConnectionString = this.ConnectionString;

А коннектион стринг та что this.ConnectionString ничто иное как наполовину вручную, наполовину автоматически сгенерированная исходя из информации предоставленной пользователем строка подключения:

ConnectionString = "Data Source=" + this.cb_selectserver.Text.Trim() + ";" +
                               "Initial Catalog=diller_info;" +
                               "User ID=" + this.tb_user.Text.Trim() + ";" +
                               "Password=" + this.tb_passwd.Text.Trim();

А то что в сурсах валяется строка подключени - так я уже и подзабыл как то в процессе разработки  smile  

Автор: mr.DUDA 29.6.2006, 17:25
Softaz, другой хороший вариант решения проблемы - добавить классу датасета свою "нашлёпку" в виде partial class-файла, в котором  объявляешь частичный класс с тем же именем, что у датасета, и выносишь _connection в виде открытого свойства. Либо делаешь свой конструктор, зачитывающий connection string после отработки base-конструктора. 

Автор: arilou 30.6.2006, 23:24
Цитата(mr.DUDA @  29.6.2006,  17:25 Найти цитируемый пост)
Softaz, другой хороший вариант решения проблемы - добавить классу датасета свою "нашлёпку" в виде partial class-файла, в котором  объявляешь частичный класс с тем же именем, что у датасета, и выносишь _connection в виде открытого свойства. Либо делаешь свой конструктор, зачитывающий connection string после отработки base-конструктора.  

Именно так мы и делаем  smile  

Автор: Хоббит 2.7.2006, 12:26
Вот я тормозил ... а надо было то бобавить по 5 строчек к каждому классу smile .... нда 

Автор: Softaz 3.7.2006, 08:01
mr.DUDA, спасибо за "нашлепку" - хороший способ. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)