Външен език за програмиране
Втори подход за интегриране на БД в ИС е чрез външен език. Естественият за Access е Visual Basic; ние ще ползваме изучавания C# (интегрирането с VB е аналогично). За програмистите, свикнали с процедурен стил, външният език дава повече свобода — но достъпът до данните в РБД и тук става само със SQL заявки.
Двата основни момента на подхода:
- Свързване с базата — осъществява се чрез специализиран софтуер медиатор (database server), който комуникира между процедурната програма и SQL базата.
- Получаване на достъп до данните — в обектно-ориентиран език обикновено като множества от инстанции на класове, чиято структура е аналог на релационните схеми (същият брой атрибути, същите или подходящи типове).
Свързване на C# приложение с Access БД
Във Visual Studio: Tools → Connect to Database → Data Source „Microsoft Access Database File (OLE DB)" → избираме .accdb файла (потребител Admin, без парола). От Advanced копираме ключовия текст за свързването (connection string). Средата отваря Server Explorer с елементите на базата.
Как C# категоризира заявките на Access
Терминологията се различава: таблиците са Tables, а заявките се разпределят така — INSERT/UPDATE/DELETE (променят данните) → Stored Procedures; параметризираните → Functions (като функции искат стойности на параметрите); всички останали (просто извличат във временна таблица) → Views. Формите и отчетите НЕ са достъпни — те са специфични за СУБД, докато таблиците и SQL заявките са универсални.
Интегриране в конзолно приложение
Осигуряваме достъпа с два оператора using и два низа:
using System.Data;
using System.Data.OleDb;
string con = "Provider = Microsoft.ACE.OLEDB.12.0; " +
"Data Source=C:\School.accdb";
string query = "SELECT Номер, Име, Фамилия FROM Ученик " +
"WHERE Номер < 6";Трите класа на медиатора OleDb:
| Клас | Роля |
|---|---|
OleDbConnection | свързва приложението с OleDb (приема connection string) |
OleDbCommand | асоциира SQL заявката с базата посредством connection |
OleDbDataReader | чете данните: всяко Read() прочита ЕДИН кортеж и връща true; след последния — false |
using (OleDbConnection connection = new OleDbConnection(con))
{ OleDbCommand comm = new OleDbCommand(query, connection);
connection.Open();
OleDbDataReader reader = comm.ExecuteReader();
while (reader.Read())
{ Console.Write(reader[0].ToString() + " ");
Console.WriteLine(reader[1] + " " + reader[2]);
}
// винаги спирайте четеца, когато е завършил четенето!
reader.Close(); Console.WriteLine("Done");
}Блокът using е важен
От влизането в блока (и връзката с базата) до напускането му СУБД не позволява друга заявка върху таблиците, участващи в заявката. Кортежът е достъпен като колекция: reader[0], reader[1]… И винаги затваряй четеца с reader.Close().
Интегриране в приложение с графичен интерфейс
Основната форма Form1 наподобява стартовата форма от Access: етикет „Информационна система *УЧИЛИЩЕ*", бутони Ученици, Учители, Оценки и КРАЙ. Бутонът Край: Form.ActiveForm.Close(); в събитието button4_Click.
За списъка с ученици добавяме listBox1 (скрит, Visible = false) и бутон ОК. Свързването е същото като в конзолното приложение; в цикъла while заместваме извеждането на конзолата с попълване на списъчната кутия:
listBox1.Items.Add(reader[0] + " " + reader[1].ToString() + " "
+ reader[2] + " " + reader[3]);Практикум и контрол (задачи от учебника)
1) Въведете конзолното приложение и заменете заявката с параметрична (от кой до кой номер). 2) Конзолно приложение с текстово меню с номерирани възможности за справки. Контрол: довършете вашата ИС — таблици, заявки, форми, справки, интегриране, кратка документация и презентация пред съучениците.
Какво трябва да запомниш
- Външен език ≠ без SQL: достъпът до РБД винаги е чрез SQL заявки.
- Медиаторът (OleDb) стои между процедурната програма и базата.
- Connection string: Provider + Data Source.
- OleDbConnection → OleDbCommand → OleDbDataReader; Read() чете кортеж по кортеж.
- using блок пази връзката; reader.Close() е задължителен.
- Access заявките в C#: променящи → Stored Procedures, параметризирани → Functions, останалите → Views.