Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual2.doc
Скачиваний:
5
Добавлен:
07.03.2016
Размер:
3.31 Mб
Скачать

10.12. Використання у якості джерела даних електронної таблиці Excel

Приклад роботи з MS Excel в якості джерела даних знаходиться у папці DISK\ADO\ADO_EXCEL.

Створимо однодокументний SDI додаток з назвою ADO_Excel для підключення до файлу електронної таблиці MS Excel. Цей додаток багато в чому схожий на ADO_NACH, який було розглянуто у п. 10.10 посібника. В клас документа внесемо наступні змінні:

class COtDoc : public CDocument

{

.............................................................

public:

_ConnectionPtr pConn;

_RecordsetPtr pRecordset;

FieldsPtr fields;

.............................................................

};

Об’єкт pConn типу _ConnectionPtr потрібен для створення з’єднання з файлом БД (або електронної таблиці). Об’єкт pRecordset типу _RecordsetPtr потрібен для створення набору даних (таблиці).

У конструкторі класу напишемо наступний код:

COtDoc::COtDoc()

{

CoInitialize(NULL); // ініциалізація COM и ADO

pConn = 0;

pRecordset = 0;

if(pConn.CreateInstance("ADODB.Connection"))

{

pConn = 0;

MessageBox(0,"Не выполнена инициализация Connection","Внимание!!!",MB_ICONINFORMATION);

return;

}

if(pRecordset.CreateInstance("ADODB.RecordSet"))

{

MessageBox(0,"Не выполнена инициализация Recordset","Внимание!!!",MB_ICONINFORMATION);

pConn.Release();

pConn = 0;

pRecordset = 0;

}

}

Як видно із коду конструктора відбувається створення об’єктів pConn та pRecordset за допомогою функції CreateInstance.

Створимо у додатку діалогове вікно Dialog_gr через яке будемо відкривати та переглядати дані із файлу електронної таблиці. Відкриття файлу електронної таблиці буде відбуватись у функції OnXLS:

void Dialog_gr::OnXLS()

{

if(pConn->GetState())pConn->Close();

if(pRecordset->GetState())pRecordset->Close();

CFileDialog OpenDialog(true, "", "",

OFN_FILEMUSTEXIST |OFN_HIDEREADONLY,

"Microsoft Excel (*.xls)|*.xls|");

if (OpenDialog.DoModal()!=IDOK) return;

str_con="Provider=Microsoft.Jet.OLEDB.4.0; Extended Properties='Excel 8.0;HDR=No'; Data Source=";

str_con+=OpenDialog.GetPathName();

m_zapr.SetWindowText("select * from [list$]");

try

{

Connect_Baza(str_con);

}

catch(_com_error &ce)

{

ErrMessage(ce);

if(pConn->GetState())pConn->Close();

return;

}

MessageBox(pConn->GetConnectionString(),

"Полная строка подключения",MB_ICONINFORMATION);

}

У функції OnXLS відбуваються такі дії: виклик діалогового вікна для вибору файлу (об’єкт OpenDialog типу CFileDialog), заповнення текстового рядку str_con (який потрібен для ініціалізації об’єкту pConn), виклик функції Connect_Baza, виведення повідомлення із текстом рядку для підключення файлу електронної таблиці (рис. 10.11).

Рис. 10.11. Текст рядку підключення до файлу електронної таблиці

Функція Connect_Baza має наступний вигляд:

void Dialog_gr::Connect_Baza(CString str)

{

pConn->ConnectionTimeout = 15000;

// максимальний час з’єднання в мсек

pConn->CommandTimeout = 15000;

// максимальний час виконання команди в мсек

pConn->Mode=adModeReadWrite;

// режим доступу для читання/запису

pConn->Open((_bstr_t)str,"","",0);

// параметри функції Open:

// 1) - рядок підключення

// 2) – ім’я користувача (UserID)

// 3) - пароль користувача (Password)

// 4) - опція підключення у синхроному (0) або асинхроному режимі

}

У ній встановлюються параметри об’єкта pConn а методом Connection::Open створюється підключеня до файлу електронної таблиці. Більш детальну інформацію про властивості і методи класу Connection було наведено у таблицях 10.1, 10.2.

Якщо вдалося створити підключення до файлу електронної таблиці, то ми отримаємо можливість робити SQL-запити для отримання набору даних та виведення їх у елемент керування CDataGrid. При натисненні кнопки «Запрос» у вікні діалогу викликається функція OnZapros, яка формує набір даних на основі запиту введеного у текстове поле:

void Dialog_gr::OnZapros()

{

if (!pConn->GetState())return;

if (pRecordset->GetState())pRecordset->Close();

CString str_query;

m_zapr.GetWindowText(str_query);

str_query.MakeUpper();

try

{

// Реалізація SQL - запиту

Recordset_Baza(str_query);

// Прив’язка об’єкта Recordset до Datagrid

m_grid.SetRefDataSource(pRecordset);

}

catch(_com_error &ce)

{

ErrMessage(ce);

if(pRecordset->GetState())pRecordset->Close();

}

}

У функції виконуються такі дії: вводиться текстовий рядок str_query (у якому буде міститись SQL запит), через вказівку на текстове поле m_zapr заповнюємо рядок str_query функцією GetWindowText, через функцію MakeUpper переводимо текст запиту до верхнього регістру (великі букви), викликаємо функцію Recordset_Baza (яка буде наведена далі), встановлюємо результати запиту у елемент m_grid функцією SetRefDataSource. Інструкції try і catch потрібні на випадок не спрацювання SQL запиту.

Функція Recordset_Baza виконує настройки об’єкта pRecordset та створює набір даних:

void Dialog_gr::Recordset_Baza(CString str)

{

pRecordset->CursorLocation = adUseClient;

pRecordset->Open((_bstr_t)str, (IUnknown*)pConn,

adOpenDynamic, adLockOptimistic, adCmdText);

fields = pRecordset->GetFields();

// параметри функції Open:

// 1) - текст SQL-запиту

// 2) – об’єкт Connection або рядок підключення

// 3) - тип курсору

// 4) - тип блокування

// 5) - опція; для SQL-запиту - adCmdText

}

Властивості та методи об'єкта Recordset було наведено у таблицях 10.5, 10.6.

Результат роботи програми приведено на рис. 10.12:

Рис. 10.12. Діалогове вікно з відкритим файлом електронної таблиці

Файл електронної таблиці «ot.xls», відкритий у програмі MS Excel, який є джерелом даних, приведено на рис. 10.13:

Рис. 10.13. Файл електронної таблиці «ot.xls»

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]