В статье «Создание базы данных SQL Server» была описана простая БД автотранспортного предприятия Garage, состоящая из трех таблиц: Cars, Drivers, Routes.
Среда Visual Studio 2017 Community позволяет исследовать SQL-запросы без программирования. Для примера найдем нашу БД Garage в окне Обозревателя объектов SQL Server. После клика правой кнопкой на имени БД, в выпадающем меню выберем позицию Создать запрос… В окне SQLQuery1.sql запишем:
Use Garage
Select * From Cars
Select * From Drivers
Select * From Routes
Первая строка указывает имя используемой БД, а остальные три – выбирают поля соответствующих таблиц.
Запустив запросы на выполнение (зеленая кнопка-треугольник Executive или F5), вы увидите содержимое всех ваших трех таблиц, например:

Теперь перейдем к программированию. Из статьи «Генератор поставщиков данных. Пример независимого кода» используем способ доступа к данным через файл App.config (просто скопируйте его).
Сначала выведем исходные данные — как есть (для прямого сравнения результатов). Затем добавим запрос: «Какие водители и автомобили закреплены за конкретными маршрутами?». После этого удалим в таблице Drivers запись о каком-либо водителе и добавим другую. После чего изменим номер маршрута в таблице Routes.
Текст файла Program.cs
using System;
using System.Configuration;
using System.Data.Common;
namespace команды_SQL
{
class Program
{
static void Main(string[] args)
{
// Подключение к БД, см. http://c-sharp.pro/?p=1406
string dp = ConfigurationManager.AppSettings["provider"];
string cnStr = ConfigurationManager.AppSettings["conStr"];
DbProviderFactory df = DbProviderFactories.GetFactory(dp);
using (DbConnection cn = df.CreateConnection())
{
cn.ConnectionString = cnStr;
cn.Open();
DbCommand cmd = df.CreateCommand();
cmd.Connection = cn;
// Исходные данные через SELECT
string strSQL = "Select * From ";
// Вывод парка машин - исходные данные
cmd.CommandText = strSQL + "Cars";
using (DbDataReader dr = cmd.ExecuteReader())
{
Console.WriteLine("\n Автопарк");
while (dr.Read())
Console.WriteLine("-> ID - {0} | ТипАвто-{1} |
госномер-{2} | число пассажиров-{3}",
dr[0], dr[1], dr[2], dr[3]);
}
// Вывод списка водителей - исходные данные
cmd.CommandText = strSQL + "Drivers"; ;
using (DbDataReader dr = cmd.ExecuteReader())
{
Console.WriteLine("\n Водители");
while (dr.Read())
Console.WriteLine("-> ID - {0} | {1} | права-{2} |
работа/выходной-{3}", dr[0], dr[1], dr[2], dr[3]);
}
// Вывод таблицы маршрутов (номер - авто - водитель)
cmd.CommandText = strSQL + "Routes";
using (DbDataReader dr = cmd.ExecuteReader())
{
Console.WriteLine("\n Маршруты");
while (dr.Read())
Console.WriteLine("-> ID - {0} | Номер маршрута - {1} |
ID авто - {2} | ID водителя - {3}",
dr[0], dr[1], dr[2], dr[3]);
}
// --------------------------------------------------------------
// Найти в БД водителей и авто, закрепленные за конкретными маршрутами;
Console.WriteLine("\n Водитель-автомобиль");
string task_str = "SELECT Drivers.Name, Cars.Typecar " +
"FROM Routes JOIN Cars on Cars.IDcar = Routes.IDcar " +
"JOIN Drivers on Drivers.IDdr = Routes.IDdr " +
"WHERE Routes.IDrout in (1,2,3)";
cmd.CommandText = task_str;
using (DbDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
Console.WriteLine($"Водитель {dr[0]} на {dr[1]}");
}
}
// Команды Insert, Delete
try
{
string nm = "5";
Console.WriteLine("\n Удаление записи о водителе с заданным ID, вставка новой записи о водителе");
string task_Delete = "Delete from Drivers where IDdr = " + nm + ";";
string task_Insert = "Insert into Drivers values (" + nm + ", N'Петров Александр', 'D', 'false');";
string task_GetDataD = "Select * from Drivers;";
cmd.CommandText = task_Delete + task_Insert + task_GetDataD;
using (var dr = cmd.ExecuteReader())
{
while (dr.Read())
{
Console.WriteLine("-> {0} | {1} | {2} | {3}",
dr[0], dr[1], dr[2], dr[3]);
}
}
}
catch
{
Console.WriteLine("Попытка вставки новой записи о водителе с уже заданным ID");
}
// Команда Update
Console.WriteLine("\n Изменение номера маршрута");
string task_Update = "Update Routes set Number = '7' where IDrout = 2;";
string task_GetDataR = "Select * from Routes;";
cmd.CommandText = task_Update + task_GetDataR;
using (var dr = cmd.ExecuteReader())
{
while (dr.Read())
{
Console.WriteLine("-> {0} | {1} | {2} | {3}",
dr[0], dr[1], dr[2], dr[3]);
}
}
// --------------------------------------------------------
cn.Close(); // закрыть соединение
Console.ReadKey();
}
}
}
Замечание о первичных ключах. Если какое-либо поле объявляется как первичный ключ (у нас это все поля, имена которых начинаются с ID), то не может существовать записей с одинаковыми ID. Поэтому запрос Insert помещен в блок try, а обработка исключения – в блок catch.
Результат:

Поэкспериментируйте с SQL-запросами, выполняя их как на закладке Запросы, так и в программе.
Продолжение темы — в статье Действия с записями в базе данных. Диалоговый режим.
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.
![]() |
![]() |
![]() |
![]() |