Генератор / подсказка к 2 задачке

И так будем пилить генератор, не весь сразу? а постепенно. Начнем с того что будем работать с базой на более низком уровне. То есть мы сами будем создавать подключение к базе прямо из программы и сами будем вызывать запросы прямо из кода.

Такой подход более универсален в том плане, что он применим в любом языке программирования и научившись работать с ним на C# у вас не возникнет особых проблем реализовать такой же подход на любом другом языке.

Создаем приложение и подключаем библиотеку SQLClient

И так поехали. Будем создавать Windows Forms приложение:

теперь важный момент, чтобы работать с базой нам надо подключить библиотечку, которая добавляет функционал для SQL.

В .NET 5.0 она не установлена по умолчанию и надо добавлять ее вручную.

Для того чтобы устанавливать сторонние библиотечки есть репозиторий с пакетам на все случаи жизни. Находится он по адресу: https://www.nuget.org

Заходим и пишем в поиске SQL

выбираем либу System.Data.SqlClient

откроется окно, в котором надо будет скопировать команду

теперь открываем терминал

внизу должна открыться консолька:

в этой консольке мы находимся в папке решения, то есть тут

а нам надо переместить текущую папку консоли (текущая папка эта та в которой сейчас консоль будет выполнять команды) в папку DBGenerator

для этого пишем в консольку

cd DBGenerator

и жмем enter, вот так получится:

а теперь вписываем команду

dotnet add package System.Data.SqlClient --version 4.8.3

снова тыкаем enter и ждем, увидим что-то такое:

теперь если глянуть в обозревателе решения, то увидим, что там появился SQLClient

между прочим, его раньше не было, а теперь вот есть и значит можно его использовать.

Динамическое подключение к БД

У нас цель сделать достаточно гибкое приложение, по крайне мере в рамках работы на разных компьютерах. Что это значит? А это значит, что мы хотим, чтобы у нас была возможность подключится к базе данных в независимости от того где она находится, будь то просто файл с базой, или это база, расположенная на удаленному сервере.

Для таких целей существует особый формат представления так называемой строки подключения или по-английски ConnectionString

Где же взять этот ConnectionString? А берётся он очень просто, в обозревателе серверов, тыкаем на нашу БД и справа в свойствах видим

можно скопировать эту строку и увидеть

Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\m\Desktop\CatsRaces.mdf;Integrated Security=True;Connect Timeout=30

то есть строка по сути представляет собой словарик вида: ключ1=значение1;ключа2=значение2;...

Если записать это строку в столбик, то получится такой набор ключей:

давайте теперь попробуем посмотреть, как выглядит строка подключения если мы хотим подключиться не к файлу, а к серверу, например, к моей базе которая валяется на tealeaf.su

тут получаем следующий формат:

Data Source=tealeaf.su;Initial Catalog=ITStudents;Persist Security Info=True;User ID=ismb;Password=***********

тут у нас такие ключи

Ну и давайте глянем напоследок вариант, когда у нас идет соединение к БД, которая работает на локальном сервере, то бишь на вашем компе, и которую вы создавали через SQL Management. Например, у меня такая база

вот она

если я подключусь к ней из Visual Studio

тут строка выглядит совсем короткой:

Data Source=.;Initial Catalog=CatRaces;Integrated Security=True

Собственно, вопрос, к чему нам все эти строчки. А к тому что я могу используя эти строки программное подцепиться к базе и даже выполнить какой-то запрос.

Давайте глянем как это делается.

Сделаем такой мини аналог SQL Management, с помощью которого можно будет выполнить любой запрос.

И так, создаем элементы на форме

Теперь давайте загоним в txtConnectionString, какую-нибудь строку, например, я хочу подключится к файлу, значит укажу там

Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\m\Desktop\CatsRaces.mdf;Integrated Security=True;Connect Timeout=30

теперь кликаем два раза на кнопку “выполнить запрос”, добавляем using вверху

using System.Data.SqlClient;

и прописываем обработчик кнопки

а вообще это конечно можно прописать компактнее, если использовать using

Использование using гарантирует что метод close будет вызван автоматически, ну и тут еще команде можно передать сразу и текст и соединение.

Формирование строки подключения

Вообще вот этот ConnectionString который сейчас у нас выглядит как большая страшная строка можно формировать в более удобном виде. Для этого есть специальный класс SqlConnectionStringBuilder, с помощью него можно сформировать строку покомпонентно. Работает примерно так:

зачем это нужно, а затем что можно сделать поля для ввода на форме и с них считывать значения. В частности, можно даже реализовать возможность открывать файлик через OpenFileDialog. Ну теперь можно приступить к заданию

2
  • Добавить возможность выбирать подключение к локальной базе или к серверу
  • В случае работы с локальной базы, реализовать клик на кнопку при котором открывается возможность выбрать файл с базой
  • В случае с локальной должно быть два поля Название сервера которое должно мэпиться в поле DataSource, и название БД которое должно мэпиться в InitialCatalog
  • При нажатии на кнопку выполнять запрос, но соединение выполнять к той базе, которая выбрана вверху в табе с подключением.
  • [необязательно] Реализовать сохранение выбранных на форме значений в файл, чтобы при открытии формы значения восстанавливались, как сделать такой файлик смотри тут
  • [необязательно] Добавить возможность выбирать базу данных из комбобокса, как получить список БД смотри тут
  • [необязательно] Добавить возможность указывать юзер/пароль

Должно получится как-то так: