Создаем проект базы данных в Visual Studio 2019
В настоящее время базы данных (БД) являются проблемой для разработчиков, и это одна из самых сложных задач в любом проекте ПО для управления изменениями БД и синхронизации этих изменений. Для решения этой проблемы в Visual Studio имеются проекты баз данных SQL. Можно с легкостью разрабатывать, управлять, сравнивать и развертывать изменения базы данных с помощью Visual Studio.
А также можем отслеживать изменения всех объектов БД через систему контроля версий. Visual Studio Database Project предоставляет гибкие возможности для создания нового проекта базы данных из существующей БД с помощью нажатия на кнопку или возможность создания проекта базы данных с нуля.
Итак, поехали
Запускаем Visual Studio 2019, выбираем Create a new project, потом выбираем SQL Server Database Project.
Введем название базы данных и выберем место расположения файла.

После чего щелкаем по кнопке Create. А теперь правой кнопкой мыши щелкаем по проекту SampleDB и из появившейся меню выбираем Add > Table.

Присваиваем имя таблице – “Student” и щелкаем по кнопке Add.

После того, как добавили таблицу, появится окно конструктора таблицы. Здесь мы можем добавлять столбцы с типом данных.

Добавим несколько столбцов в эту таблицу. Мы увидим, что сгенерируется скрипт в нижней части окна и сохраняется схема таблицы.

Теперь пора опубликовать базу данных в SQL Server
Щелкаем правой кнопкой мыши в окне Solution Explorer по проекту базы данных. В появившемся меню выбираем Properties. В параметрах проекта выбираем версию SQL Server.

Кроме того, мы можем изменять подключение по умолчанию на вкладке Debug Щелкаем по кнопке Edit.

Изменяем свойства соединения в соответствии с параметрами ПК. Введем имя сервера, имя пользователя, пароль и выберем базу данных. Потом щелкаем по кнопке OK. Если есть проверка подлинности Windows, то не нужно указывать имя пользователя и пароль. Нам нужно только имя сервера и база данных.

Не забываем сохранять все изменения. А теперь щелкаем правой кнопкой мыши на проекте БД и выбираем Publish… Редактируем настройки Target Database.

Введем свойства подключения, такие как – если это проверка подлинности SQL Server, то указываем имя сервера, имя пользователя, пароль и выбираем базу; а если это аутентификация Windows, то указываем имя сервера и базу данных.


После чего мы жмем на кнопку Publish. Немного подождем, пока БД не будет опубликована.

Теперь запускаем SQL Server Management Studio и проверяем, есть ли база данных SampleDB или нет.

Вывод
В этой статье мы узнали, как создать проект базы данных в Visual Studio 2019 и публиковать ту же БД в SQL Server 2017.
C# и MS SQL Server
Для работы с базами данных нам естественно прежде всего надо иметь какую-нибудь базу данных. В данном случае мы будем рассматривать основные концепции ADO.NET преимущественно на примере MS SQL Serverа. Поэтому вначале нам надо установить SQL Server Express. Все необходимые материалы для установки можно найти по адресу https://www.microsoft.com/en-US/download/details.aspx?id=42299. Вместе с сервером также устанавливается специальная программа SQL Server Management Studio, которая используется для управления базами данных на сервере.
Для начала создадим простейшую базу данных на MS SQL Server. Для этого откроем SQL Server Management Studio и нажмем на узел Databases правой кнопкой мыши. После этого в открывшемся контекстном меню выберем New Database :

После этого нам открывается окно для создания базы данных:

В нем в поле Database Name нам надо ввести название базы данных. Введем usersdb . Больше здесь вводить ничего не требуется, и поэтому нажмем на ОК.
После этого в узле Databases появляется новый элемент, который представляет только что созданную базу данных usersdb. Раскроем его и нажмем правой кнопкой мыши на его подузел Tables:

Затем нам открывается дизайнер таблицы:

В нем надо указать три столбца: Id, Name и Age, которые будут представлять соответственно уникальный идентификатор пользователя, его имя и возраст. У первого и третьего столбца надо указать тип int (то есть целочисленный), а у столбца Name — тип nvarchar (строковый).
Кроме того, в окне свойств таблицы в поле Name надо ввести имя таблицы — Users, а в поле Identity ввести Id, то есть тем самым указывая, что столбец Id будет идентификатором.
И в конце нам надо установить курсор на столбец Id и в панели инструментов программы нажать на золотой ключик. После этого напротив поля Id также должен появиться золотой ключик. Этот ключик будет указывать, что столбец Id будет выполнять роль первичного ключа.
Работа с SQL Server в C# с помощью скриптинга. Часть 1
В этой статье я покажу вам, как работать с Microsoft SQL Server в C# проектах посредством скриптинга. Реализовать это можно как в Windows, так и в macOS. Поскольку Windows, очевидно, является намного более популярной целевой платформой для C# и SQL Server, больше внимания я уделю настройке под macOS. В конце концов, код для этих платформ будет одним и тем же.
Доступ к инстансу SQL Server с помощью скриптинга на самом деле дает множество преимуществ. Вот только несколько, из преимуществ, которые вы получите, настроив среду для выполнения скриптов:
Доступ к SQL Server с помощью скриптинга предполагает гораздо меньше кода. Большую часть функций можно факторизировать. Один оператор на скриптовом языке может выполнять под капотом множество C# операторов — язык скриптинга по сути выполняет роль функционального языка.
Любой SQL-оператор, который вы можете использовать напрямую с SQL Server, также может быть использован и в скриптах. Основным преимуществом здесь является то, что, если в ваш проект интегрирован Scripting Engine (обработчик скриптов), то вы можете запускать любой оператор SQL Server во время выполнения.
Синтаксис скриптового языка может быть не только лаконичнее, проще и точнее, но он также полностью зависит от того, как вы сами решили определить этот синтаксис. Это преимущество раскрывается в полной мере, если вы используете скриптовый язык с открытым исходным кодом.
Простота не предшествует сложности, а вытекает из нее. – Алан Перлис (Alan Perlis)
Но я сразу хочу отметить, что существует один существенный недостаток, связанный с использованием скриптов, а именно накладные расходы на парсинг выражений. В этой статье я продемонстрирую вам, как уменьшить эти накладные расходы, используя в качестве примера вставку нескольких строк в базу данных.
В качестве языка скриптинга я буду использовать CSCS (Customized Scripting для C#). Я уже рассказывал об этом языке в нескольких мои предыдущих статьях для CODE Magazine (вы можете найти ссылки на них в конце этой статьи). CSCS — это скриптовый язык с открытым исходным кодом, который очень легко интегрировать в ваш C# проект. Открытый исходный код дает вам оговоренное выше преимущество в виде возможности модифицирования его в процессе разработки.
Среди прочего, я собираюсь раскрыть в этой статье следующие темы:
Работа с SQL Server в macOS, где будут выполняться все примеры, приведенные в этой статье (код CSCS идентичен в macOS и в Windows).
Как избежать SQL-инъекций в CSCS.
Я продемонстрирую вам на примере, как можно использовать простые функциональные возможности курсора SQL Server в CSCS. Он допускает более интуитивно понятный синтаксис, чем при непосредственном использовании C#.
Как вызывать хранимые процедуры SQL Server из CSCS и как использовать пользовательские типы данных SQL.
Установка Microsoft SQL Server в macOS
Поскольку установка и запуск SQL Server в Windows является вполне рутинной задачей, здесь вы увидите, как установить и запустить его в macOS. Чтобы запустить SQL Server на Mac, вам придется выполнить следующие шаги:
Установите Docker для Mac (отсюда)
Запустите только что установленное приложение Docker Desktop (оно должно быть доступно в папке “Applications”). Обычно оно расположено по следующему пути: /usr/local/bin/docker.
Загрузите и установите SQL Server для Docker-образа Linux. Для запуска из вашего shell используйте следующую команду:
Если это не сработает из-за проблем с разрешениями, попробуйте запустить ту же команду с sudo (для этого вам нужно будет знать пароль администратора):
Затем запустите только что установленный Docker-образ следующим образом:
Вы также можете установить консольный клиент SQL Server, запустив в своем shell следующую команду:
Если вы снова столкнетесь с какими-либо проблемами с разрешениями, то добавьте к команде выше sudo. Этот шаг не является обязательным, но настоятельно рекомендуется. Установите Microsoft Azure Data Studio, перейдя по ссылке.
Очевидно, что существует множество других бесплатных GUI-оболочек SQL Server, но я пришел к выводу, что Azure Data Studio для macOS достаточно мощная и составляет достойную конкуренцию Microsoft SQL Server Management Studio для Windows.
Теперь вам осталось только проверить, что все работает так, как надо. Чтобы подключиться к вашему серверу из командной строки, используйте эту команду:
Чтобы проверить установленную версию Microsoft SQL Server, просто запустите:
Результат выполнения этой команды в моей системе продемонстрирован на рисунке 1.

Рисунок 1: Определение версии SQL Server
В качестве альтернативы, вы можете проверить подключение, используя Azure Data Studio, кликнув на “New Connection”, а затем следуя указаниям мастера подключения, как показано на рисунке 2. Введите тот же пароль, который вы использовали при создании Docker-образа Microsoft SQL Server выше на шаге 4.

Рисунок 2: Мастер подключения Azure Data Studio
Настройка скриптинговой среды CSCS в C# проекте
Чтобы настроить CSCS-скриптинг в вашем проекте, для начала вам нужно будет загрузить его исходный код с https://github.com/vassilych/cscs и включить его в свой проект. Это типичный проект, который будет работать со всеми консольными или фоновыми проектами (как в Windows, так и в macOS).
Одним из способов включения CSCS Scripting Engine в Windows GUI проект является WPF (Windows Presentation Foundation) проект, доступный здесь. Еще один способ — мобильный проект Xamarin iOS / Android, который можно скачать отсюда. В конце этой статьи вы можете найти ссылки, которые описывают, как использовать оба этих проекта.
После того, как вы все настроите, проект Xamarin должен выглядеть как показано на рисунке 3. Исходный код Scripting Engine находится в разделе scripting.Shared. В случае с WPF-проектом скрипты будут находиться в разделе CSCS.

Рисунок 3: Проект Xamarin с CSCS сериптами в Visual Studio на macOS
Точка входа CSCS Scripting Engine зависит от контекста проекта. Для простого консольного проекта точкой входа является статический метод файла Main.cs Main.ProcessScript(string script, string filename = «») . Для WPF-проекта точкой входа является статический метод CSCS_GUI.RunScript(string filename) в файле CSCS_GUI.cs. А для Xamarin проектов iOS и Android точкой входа служит статический метод CustomInit.InitAndRunScript(string fileName = «start.cscs») файла CustomInit.cs . Если вы решите использовать примеры проектов из упомянутых выше GitHub-репозиториев, методы, которые запускают CSCS Scripting Engine, будут запускаться автоматически на старте проекта.
Я также рекомендую установить CSCS Debugger и REPL-расширение для Visual Studio Code. Он позволяет запускать любой CSCS-скрипт во время выполнения (смотрите ссылки для скачивания и использования в конце статьи). Чтобы иметь возможность подключиться к вашему CSCS-проекту из Visual Studio Code, в стартовый CSCS-скрипт должна быть включена следующая строка (по умолчанию это будет start.cscs):
Создание базы данных и таблиц в SQL Server
После установки SQL Server и интеграции CSCS Scripting Engine в ваш проект вы можете приступать к созданию базы данных SQL Server, которую мы будем использовать в последующих примерах.
Это можно сделать в самом CSCS. Все функции SQL Server описаны в таблице 1. Сначала вам нужно создать новую базу данных:
Первый оператор инициализирует строку подключения к SQL Server (с базой данных master), а второй — создает новую базу данных. Также, так как вы можете запустить любой SQL-оператор с помощью функции SQLNonQuery() , в вашем арсенале есть еще один простой способ создания базы данных:
Далее вам нужно создать таблицу с пользователями. Обратите внимание, что в строке подключения к SQL Server вам теперь нужно указать новую базу данных CSCS, чтобы новая таблица была создана там:
Обратите внимание на то, как мы создали таблицу Users: нет необходимости указывать ID пользователя и таймстемп: первому будет присвоено следующее по порядку целое число, а в качестве второго будет использоваться текущий таймстемп.
Давайте заполним только что созданную таблицу Users некоторыми тестовыми данными:
После что таблица будет выглядеть, как показано на рисунке 4:

Рисунок 4: Таблица Users после заполнения тестовыми данными
Список реализованных в настоящее время CSCS-функций, связанных с SQL Server, вы можете найти в таблице 1.
Теперь мы можем начать нашу работу с SQL через CSCS-скриптинг.
Базовые функции SQL Server
Самый простой способ использовать скрипты во время выполнения после запуска основной программы — использовать REPL-расширение CSCS для Visual Studio Code. С ним вы сможете запустить новый скрипт после запуска программы. Этот REPL-функционал можно использовать следующим образом: выберите код, который вы хотите запустить, а затем нажмите Ctrl + 8 в Windows или Command + 8 в macOS.
На рисунке 5 показано, как можно запросить информацию о столбцах созданной вами таблицы Users.

Рисунок 5: Запуск CSCS из Visual Studio Code с помощью REPL-расширения CSCS
Команда SQLTableColumn(tableName) возвращает список имен столбцов вместе с их типами. Если вам нужны только имена столбцов, укажите второй аргумент (“onlyNames” должен иметь значение true). Подробности смотрите в таблице 1.
Функция SQLQuery() используется для запуска Select -операторов и получения списка результатов. Рассмотрим следующий оператор SQLQuery() :
В результате выполнения этого оператора переменной будет присвоен список, содержащий четыре элемента:
Каждый элемент в возвращенном списке также является списком, которых содержит два элемента для каждого из столбцов в операторе Select. Первый элемент возвращаемого списка всегда содержит имена столбцов, а остальные содержат сами строки. Таким образом, возвращаемый список по факту представляет из себя двумерный массив: results[0][0] = «FirstName», results[1][1] = 65000 и т. д.
Функция SQLNonQuery() позволяет выполнять все остальные операторы SQL Server. Она может обновлять таблицы, удалять строки, создавать новые таблицы или хранимые процедуры и т. д. Эта функция возвращает количество затронутых строк в случае операторов UPDATE, DELETE или INSERT. В остальных случаях она всегда возвращает -1.
Вот один из примеров использования этой функции:
После выполнения приведенного выше оператора переменная updated будет равна 1 (затронута всего одна строка). Ниже вас ждет еще пара примеров использования функции SQLNonQuery() .
Скриптинг и SQL-инъекции
Любой из приведенные выше примеров может быть потенциально использован для SQL-инъекций, если одно из полей, используемых в SQL-запросе или в любом другом операторе, имеет значение, которое должен предоставить пользователь.
SQL-инъекция — это атака с внедрением кода, в рамках которой злоумышленники имеют возможность выполнять вредоносные SQL-операторы, чтобы либо повредить сервер, либо извлечь данные, к которым у них не должно быть доступа.
Например, с помощью атаки с внедрением кода через поле для ввода данных вы можете получить адрес электронной почты пользователя, а затем извлечь информацию о пользователе следующим образом:
Затем злоумышленник может ввести этот текст вместо электронной почты:
Далее этот аргумент может попасть в SQLQuery, что будет выглядеть следующим образом:
Этот запрос возвращает всех пользователей, поскольку условие 1=1 всегда истина! Чтобы избежать такого рода хакерских атак, можно использовать следующие средства защиты:
Используйте хранимые процедуры (им посвящен следующий раздел).
Используйте параметризованные параметры (это мы тоже разберем чуть дальше).
Чтобы исправить приведенный выше Select-оператор, можно использовать параметризованный вызов, в котором вы дополнительно предоставляете список параметров для запроса. Этот список в свою очередь будет состоять из списков из двух элементов, где первый элемент — имя параметризованного параметра (такое же, как используется в запросе), а второй элемент — фактическое значение. Вот так будет выглядеть “безопасный” вызов SQL-запроса:
Точно так же вы можете использовать параметры с любыми другими операторами SQL Server. Вот как будет выглядеть параметризованный вызов оператора Update из предыдущего раздела, только с двумя параметрами:
Также, если вы используете хранимые процедуры, вы можете безопасно передавать им аргументы. Об этом мы поговорим во второй части, которая выйдет буквально через несколько дней.
А пока приглашаем всех желающих на открытое занятие, на котором поговорим о модульном тестировании кода SQL Server и использовании для этого tSqlt. Занятие состоится уже сегодня вечером, записаться можно по ссылке.
Также приходите на бесплатный урок «Статический анализатор кода на Roslyn своими руками». На этом занятии разберем по шагам создание собственного статического анализатора кода на базе Roslyn API. Регистрация доступна на странице курса «C# Developer. Professional».
Как сделать базу данных на c

- Managed Only – оптимальный вариант, для тех, кто создает приложения, которые должны работать как в Windows, так и в Linux-based операционных системах. В данном случае сборка включает в себя только управляемый код провайдера, а в зависимости от ОС понадобиться родная версия библиотеки SQLite (например: sqlite3.dll в Windows), которые можно взять с http://www.sqlite.org.
- Compact Framework – версия для работы в среде .NET CF для мобильных устройств под управлением Windows CE. Включает в себя wrapper для неуправляемой библиотеки SQLite и реализации необходимых интерфейсов ADO.NET. Сама неуправляемая библиотека движка SQLite для Windows CE расположена там же, где и сборка System.Data.SQLite.dll – это файл SQLite.Interop.060.DLL.
- Itanium – версия адаптера для работы на процессорах Intel Itanium. В этом случае для работы приложения достаточно только сборки System.Data.SQLite.dll, в которой уже содержится неуправляемый код движка SQLite.
- x64 – версия для платформ с архитектурой x64. Так же содержит управляемую и неуправляемую части в одной сборке.
- x86 – версия для платформ с архитектурой x86. Устроена так же как x64 и Itanium версии и не требует каких-либо неуправляемых версии библиотеки движка SQLite.
Создание базы данных SQLite
using System;
using System.IO;
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
class Program
static void Main( string [] args)
string baseName = «CompanyWorkers.db3» ;
SQLiteFactory factory = (SQLiteFactory)DbProviderFactories.GetFactory( «System.Data.SQLite» );
using (SQLiteConnection connection = (SQLiteConnection)factory.CreateConnection())
connection.ConnectionString = «Data Source #0000ff»>using (SQLiteCommand command = new SQLiteCommand(connection))
command.CommandText = @»CREATE TABLE [workers] (
[id] integer PRIMARY KEY AUTOINCREMENT NOT NULL,
[name] char(100) NOT NULL,
[family] char(100) NOT NULL,
[age] int NOT NULL,
[profession] char(100) NOT NULL
);» ;
command.CommandType = CommandType.Text;
command.ExecuteNonQuery();
>
>
>
>
* This source code was highlighted with Source Code Highlighter .

Редактирование базы данных SQLite
- Настроим превый объект SqlDataSource1. В редакторе он используется лишь как источник данных для объекта GridView1, поэтому при настройке подключения к базе достаточно будет указать, что необходимо только извлекать данные из CompanyWorkers.db3, это легко сделать в окне настроек SqlDataSource1:
- После настройки SqlDataSource1 необходимо добавить в форму объект класса GridView, что делается простым перетаксиванием контрола из Toolbox’а на apsx-страницу. Для получившегося объекта GridView1 выбираем источник данных SqlDataSource1. В настройках GridView1 включаем опцию Enable Selection, которая понадобится при редактировании нужной строки.
- Следующим добавляем в форму элемент класса DetailsView и еще один объект класса SqlDataSource. Элемент DetailsView1 будет основным редактором данных таблицы workers. Предварительно настроим SqlDataSource2 на выбор нужной записи из таблицы для DetailsView1 при нажатии Select напротив интересующего работника в GridView1. Для этого в настройках источника данных заходим в WHERE и указываем, как осуществляется выбор текущего элемента для DetailsView1:
- Возвращаемся к предыдущему окну и в Advanced ставим галку для генерации запросов на вставку, обновление и удаление записей в таблице:
- Устанавливаем SqlDataSource2 в качестве источника данных для DetailsView1. В целом приложение уже готово, но при работе с ним можно заметить, что при добавлении и удалении сотрудников с помощью DetailsView1 в DataGrid1 данные не обновляются, чтобы это исправить необходимо добавить обработчики в DetailsView1 для событий ItemDeleted, ItemUpdated и ItemIserted, в которых связываем DataGrid1 с обновившимися данными:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using DataEditor.CompanyWorkersTableAdaptersTableAdapters;
protected void DetailsView1_ItemDeleted( object sender, DetailsViewDeletedEventArgs e)
GridViewDataBind();
>
protected void DetailsView1_ItemUpdated( object sender, DetailsViewUpdatedEventArgs e)
GridViewDataBind();
>
protected void DetailsView1_ItemInserted( object sender, DetailsViewInsertedEventArgs e)
GridViewDataBind();
>
>
>

Рис. 5. Редактор, готовый к работе.