Примеры SQL-запросов. Microsoft SQL Server и язык T-SQL

В статье «Создание базы данных 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-запросами, выполняя их как на закладке Запросы, так и в программе.

Продолжение темы — в статье Действия с записями в базе данных. Диалоговый режим.

Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *