Подтвердить что ты не робот

Лучший способ установить строго типизированную строку соединения набора данных во время выполнения?

В моем приложении Windows Forms используется сильно типизированный набор данных, созданный с помощью конструктора в Visual Studio. Во время выполнения я хотел бы иметь возможность выбирать либо живую, либо тестовую базу данных.

Каков наилучший способ программно установить строку подключения для набора данных во время выполнения?

4b9b3361

Ответ 1

Свойство Connection в TableAdapters определено как внутреннее.

internal global::System.Data.SqlClient.SqlConnection Connection

Итак, если ваш TypedDataset не находится в та же самая сборка, что и ваши главные окна форм, вы не сможете доступ к свойству Connection. Эта проблема может появиться позже, когда вы реорганизовать свой код набора данных и переместить его в отдельный проект, который создать собственную независимую сборку.

Чтобы решить эту проблему, вы можете сделать, как указано ниже.

создайте частичный класс для вашего TableAdapter и добавьте еще один конструктор рядом с открытым стандартным конструктором без параметров. Предполагая тип TableAdapter как MyTableAdapter

public partial class MyTableAdapter
{
    public MyTableAdapter(SqlConnection connection)
    {
        thisSetConnection(connection);
        this.ClearBeforeFill = true;
    }

    public void SetConnection(SqlConnection connection)
    {
        this._connection = connection;
    }
}

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

Теперь во время выполнения вы можете создать экземпляр своего TableAdapter, как это.

SqlConnection connection;
//create the connection here at runtime..
MyTableAdapter adapter = new MyTableAdapter(connection);

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

SqlConnection connection;
//create the connection here at runtime..
MyTableAdapter adapter = new MyTableAdapter();
adapter.(connection);

Ответ 2

Сохраните строки подключения для них как в app.config, так и затем вы можете переключаться на основе командной строки/запуска. Или, если вы хотите предоставить пользователю гибкость, вы можете дать им страницу параметров, где они могут выбрать, какое соединение использовать.

Ниже приведен код для считывания пускового ключа:

string[] args = Environment.GetCommandLineArgs();
// The first (0 index) commandline argument is the exe path.
if (args.Length > 1)
{
    if (Array.IndexOf(args, "/live") != -1)
    {
        // connection string = 
        // ConfigurationSettings.AppSettings["LiveConString"];
    }
}
else
{
    // connection string = 
    // ConfigurationSettings.AppSettings["TestConString"];
}

Итак, теперь вы запускаете свое приложение, вызывая:

MyApp.exe /live

Используя MyApp.exe самостоятельно или с любым другим коммутатором, вы получите тестовую конфигурацию.

Ответ 3

Re: комментарий с комментариями

Мастер сохраняет строку подключения при настройке набора данных, но это не значит, что вы не можете сделать ее динамичной. Как зависит от того, какую версию вы используете, но в целом, если вы расширите файлы под вашим набором данных, вы найдете файл типа Designer.cs или DataTableNameAdapter.xsd. Вы можете открыть эти файлы и выполнить поиск _соединения. Обычно это приватная переменная и устанавливается в функции init в классе.

Вы можете сделать настройку динамической, добавив следующий код:

public string ConnectionString
{
    get { return this._connection.ConnectionString; }
    set
    {
        if (this._connection == null)
        {
            this._connection = new System.Data.SqlClient.SqlConnection();
        }
        this._connection.ConnectionString = value;
    }
}

Обратите внимание, что если вы регенерируете набор данных, вы, скорее всего, потеряете этот раздел кода, и без рефакторинга набора данных вам может потребоваться добавить его к нескольким объектам.

Ответ 5

Самое лучшее решение, которое я нашел до сих пор:

Добавьте еще одну настройку программы, которая содержит вашу предварительно выбранную строку подключения, заданную клиентом во время выполнения (например, newConnectionString)

перед использованием адаптера таблицы:

this.myTableAdapter.Connection.ConnectionString = Properties.Settings.Default.newConnectionString;

Ответ 6

Это боль для редактирования файла конструктора.

Я создал запись "Настройки" в разделе "Пользователь" под названием "ConnectionString", которая заставляет Visual Studio создавать строку приложения "Connection String1" при добавлении строго типизированного набора данных.

Итак, я просто заменяю все "ConnectionString1" на "ConnectionString" в файле конструктора набора данных, и это позволит вам использовать строковый параметр "Пользователь" для загрузки строки подключения во время выполнения.

IMHO это недостаток, позволяющий пользователям изменять строки подключения во время выполнения. (Кто-нибудь слушает в Редмонде?)