Статья:
Как предоставить пользователю выбор источника данных для создания ADO Connection?Автор(ы): Марк Балонкин
Дата: 27.09.2001
Авторы:
Марк Балонкин
Аннотация:
Для определения источника данных во время выполнения существует DataLink диалог. Создать или отредактировать ADO Connection с помощью DataLink поможет IDataSourceLocator (OLE DB). Пример кода:
В ATL OLEDB consumer templates для этого имеется класс CEnumerator:
#include <atlbase.h>
#include <atldbcli.h>
int main(int argc, char* argv[])
{
CoInitialize(NULL);
{
CEnumerator rs;
rs.Open();
while (rs.MoveNext() == S_OK)
printf("%ls\n", rs.m_szName);
}
CoUninitialize();
return 0;
}
Можно также напрямую воспользоваться интерфейсом ISourcesRowset:
CComPtr<ISourcesRowset> spSourcesRowset = NULL;
CCommand<CDynamicAccessor> rs;
HRESULT hr;
// Create the enumerator
hr = spSourcesRowset.CoCreateInstance(CLSID_OLEDB_ENUMERATOR,
NULL, CLSCTX_INPROC_SERVER);
// Get the rowset so we can enumerate the data sources
hr = spSourcesRowset->GetSourcesRowset(NULL, IID_IRowset, 0,
NULL, (IUnknown**)&rs.m_spRowset);
hr = rs.Bind();
while (rs.MoveNext() == S_OK)
printf("%ls\n", rs.GetValue(1L));
Здравствуйте, Марк Балонкин, Вы писали:
МБ>Статья:
МБ>Как предоставить пользователю выбор источника данных для создания 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();
}
...