Re: Как предоставить пользователю выбор источника данных для
От: Goga74 Россия http://dotnetdiagz.com
Дата: 27.08.07 04:34
Оценка:
Здравствуйте, Марк Балонкин, Вы писали:

МБ>Статья:

МБ>Как предоставить пользователю выбор источника данных для создания ADO Connection?
Автор(ы): Марк Балонкин
Дата: 27.09.2001


МБ>Авторы:

МБ> Марк Балонкин

МБ>Аннотация:

МБ>Для определения источника данных во время выполнения существует DataLink диалог. Создать или отредактировать ADO Connection с помощью DataLink поможет IDataSourceLocator (OLE DB). Пример кода:

Пример на С# для работы с SqlConnection. Главное достоинство этого примера: пользователь может ввести параметры подключения 1 раз, и в дальнейшем диалог их будет помнить.
Танцы с connection string builder-рами объясняются тем, что я использую "нативное" .NET подключение — SqlConnection,
которое имеет несколько отличающийся от Ado/OleDb формат строки подключения — например, на ругается присутствие в строке ключа "Provider=".
Отличия в форматах строк connection strings для разных провайдеров см. например здесь


...
using MSDASC; // Microsoft OLE DB Service Component 1.0 Type Library
using ADODB;  // Microsoft ActiveX Data Objects 2.8 Library
using System.Runtime.InteropServices;
using System.Data.SqlClient;
using System.Data.OleDb;
...
using System.Windows.Forms;
...

    public partial class MainForm : Form
    {

    ...

        private bool TestDBConnect()
        {
            ADODB.Connection cnn = new ADODB.Connection();

            // строку подключения храним в настройках
            cnn.ConnectionString = "Provider=" + Properties.Settings.Default.connectionProvider /* SQLNCLI.1 */ + ";"+
                Properties.Settings.Default.connectionString;

            object o = (object)cnn;
            MSDASC.DataLinks dl = new MSDASC.DataLinks();
            bool result = dl.PromptEdit(ref o); // выводим стандартный диалог подключения
            if (result)
            {
                // получаем собранную в диалоге строку подключения
                OleDbConnectionStringBuilder builderOLE = new OleDbConnectionStringBuilder(cnn.ConnectionString);
                builderOLE.Remove("Provider"); // и вырезаем из нее элемент Provider как несовместимый с SqlConnection

                SqlConnectionStringBuilder builderSQL = new SqlConnectionStringBuilder(builderOLE.ConnectionString);

                try
                {
                    // проверяем - подключение рабочее?
                    cnn.Open(cnn.ConnectionString, builderSQL.UserID, builderSQL.Password, -1);                   
                }
                catch (COMException ex) // что-то случилось, подключиться не удалось
                {
                    MessageBox.Show(ex.Message, "Ошибка при подключении к базе данных", 
                        MessageBoxButtons.OK, MessageBoxIcon.Error);

                    return false;
                }

                // запоминаем последнюю ConnectionString!
                Properties.Settings.Default.connectionString = builderOLE.ConnectionString;
                Properties.Settings.Default.Save();
                cnn.Close();

            } else { // пользователь нажал Cancel в диалоге подключения
                return false;
            }
            return true;
        }

...
        private void MainForm_Load(object sender, EventArgs e)
        {
            if (TestDBConnect())
            {
                GetData();
            } // подключиться не удалось
            else this.Close();
        }
...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.