Лого на 91. НЕГ „Проф. Константин Гълъбов“

Модул 3 · Урок 27

Интегриране на БД със C# (приложение)

Достъп до релационна база от външен процедурен език: connection string, медиаторът OleDb и трите класа OleDbConnection, OleDbCommand и OleDbDataReader.

Външен език за програмиране

Втори подход за интегриране на БД в ИС е чрез външен език. Естественият за 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.