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

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

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

Ответы [ 6 ]

3 голосов
/ 27 мая 2010

Свойство соединения в 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;
    }
}

Вам нужно будет сделать это для столько же адаптеров таблиц, сколько у вас есть в вашем проекте. 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);
1 голос
/ 30 марта 2009

Re: мокрые комментарии

Мастер сохраняет строку подключения при настройке набора данных, но это не значит, что вы не можете сделать его динамическим. Как зависит от того, какую версию вы используете, но в целом, если вы развернете файлы в своем наборе данных, вы найдете такой файл, как Designer.cs или DataTableNameAdapter.xsd. Вы можете открыть эти файлы и выполнить поиск _connection. Обычно это закрытая переменная, которая задается в функции 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;
    }
}

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

1 голос
/ 30 марта 2009

Сохраните строки подключения для них обоих в файле 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 отдельно или с любым другим ключом даст вам тестовую конфигурацию.

0 голосов
/ 13 января 2011

Редактировать файл конструктора очень сложно.

Я создал запись «Настройки» в разделе «Пользователь» с именем «ConnectionString», которая заставляет Visual Studio создавать строку приложения «Строка подключения1» при добавлении строго типизированного набора данных.

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

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

0 голосов
/ 27 мая 2010

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

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

затем перед использованием Table Adapter:

this.myTableAdapter.Connection.ConnectionString = Properties.Settings.Default.newConnectionString;
0 голосов
/ 10 декабря 2009

Использование TableAdapterManager может работать для вас. Пожалуйста, прочитайте больше на: http://rajmsdn.wordpress.com/2009/12/09/strongly-typed-dataset-connection-string/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...