В первом руководстве этой серии, «Understanding RESTful API», мы рассмотрели, что из себя представляет архитектура REST, значение методов запроса HTTP и кодов состояния ответов и структуру конечной точки RESTful API. Во втором руководстве этой серии, «How to Set Up an Express API Server», мы рассмотрели, как создавать сервера и при помощи встроенного модуля HTTP Node.js, и при помощи фреймворка Express, а также как назначить маршруты для обработки запросов, выполняемых по различным URL-адресам.
В данный момент мы используем статические данные для отображения информации о пользователе в формате JSON при обращении к конечной точке API при помощи запроса по методу GET . В этом руководстве мы настроим базу данных MySQL для хранения данных, подключимся к ней из нашего приложения Node и добавим в API возможность использования методов GET , POST , PUT и DELETE для завершения реализации полноценного API.
Установка
На данный момент мы еще не использовали базу данных для хранения и выполнения манипуляций с какими-либо данными, так что мы установим ее сейчас. В этом руководстве мы будем использовать MySQL, и если у вас уже она установлена, то вы можете перейти к следующему разделу.
Программа с базой данных и интерфейсом PYQT5 на Python
Если же нет, то вы можете скачать MAMP для macOS и Windows, который предоставляет бесплатную локальную инфраструктуру веб-сервера и базу данных. После их скачивания откройте программу и нажмите Start Servers для запуска MySQL.
Помимо настройки MySQL нам также необходимо программное обеспечение с GUI для просмотра данных базы. Если вы пользуетесь Mac, то скачайте SequelPro, если Windows – то SQLyog. После скачивания и запуска MySQL вы можете воспользоваться SequelPro или SQLyog для подключения к локальному серверу при помощи имени root и пароля root по 3306 порту.
Как только разобрались с этим, мы можем перейти к созданию базы данных для нашего API.
Создаем базу данных
В программе для просмотра вашей базы добавьте новую базу данных и назовите ее api . Убедитесь, что MySQL запущена, или у вас не получится подключиться к локальному серверу.
После создания базы api перейдите в нее и выполните следующий запрос для создания новой таблицы.
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
Источник: code.tutsplus.com
SQLite + C#
В данной статье рассмотрим работу с SQLite из программы на языке C#. Основное внимание будет уделено конфигурированию проекта в MS Visual Studio для работы с SQLite, созданию базы данных, созданию таблиц и работе с таблицами: чтение/запись данных.
Исходный код доступен на GitHub.
Как работать с базой данных из Python
Введение в SQLite
Если кратко, то SQLite – это кроссплатформенная встраиваемая СУБД. Свойство кроссплатформенности я думаю пояснять не нужно, а вот с понятием “встраиваемая” наверное стоит немного разобраться. Существуют СУБД, которые представляют собой клиент-серверное приложение – это наиболее знакомый вариант.
Например Microsoft SQL Server, MySQL, PostgreSQL, различные NoSQL варианты, которых на сегодняшний день появилось огромное количество. Суть их в том, что есть выделенное приложение – сервер, которое принимает запросы от клиентов и выполняет их, оно непосредственно занимается записью/чтением данных на диск и предоставляет различные функции типа репликации и т.п. Встраиваемая СУБД не имеет выделенного сервера, ее движок включается в приложение в виде библиотеки и предоставляет доступ к базе через специализированный API.
На сегодняшний день SQLite является одной из самых популярных решений такого типа. Она используется практически повсеместно: в embedded приложениях, мобильных телефонах, различных платформах и т.д. Например браузер Google Chrome использует SQLite для хранения Cookies. SQLite обладает феноменальной надежностью (зачастую в ущерб производительности, если её неправильно “готовить”), поэтому, несмотря на то, что она является открытой, разработчики практически не принимают сообщения об ошибках.
Первое, что необходимо сделать для начала работы с SQLite – это скачать его с официального сайта (ссылка). Для приложений на платформе .NET есть возможность работать с SQLite через ADO.NET провайдер под названием System.Data.SQLite. Зайдя на страницу загрузки новичок будет наверное сбит с толку обилием возможных вариантов System.Data.SQLite. Попробуем разобраться.
- если в названии пакета для скачивания нет слова “static”, то это значит, что на машине разработчика и пользователя приложения должна стоять Microsoft Visual C++ Runtime Library (2005, 2008, 2010, 2012, 2013 или 2015).
- если в названии есть слово “setup”, то он включает в себя и автоматически устанавливает на машину Microsoft Visual C++ Runtime Library.
- пакет со словом “bundle”, используется в том случае, если библиотеки необходимо разместить в Global Assembly Cache
Сами разработчики рекомендуют брать во внимание следующие моменты при выборе дистрибутива SQLite:
- рекомендуется использовать XCOPY развертывание (простое копирование файлов) с автоматической подгрузкой нужных библиотек (определятся разрядностью процессора) (Native Library Pre-Loading);
- использовать вариант работы с Global Assembly Cache не рекомендуется, поэтому пакет со словом “bundle” качаем если только это действительно необходимо;
- использовать пакет со словом “static” на машине разработчика не рекомендуется, и вообще не стоит устанавливать такой пакет, если на машине развернута Microsoft Visual C++ Runtime Library;
- используется пакет с версией .NET, которая используется в вашем приложении;
- следите за тем, чтобы версия архитектуры процессора пакета и целевой машины совпадали.
Структура папки, в которой располагается приложение, для поддержки режима автоматической подгрузки нужных библиотек (Native Library Pre-Loading) представлена ниже
- App.exe (опционально, приложение)
- App.dll (опционально, библиотека приложения)
- System.Data.SQLite.dll (требуется, core сборка)
- System.Data.SQLite.Linq.dll (опционально, LINQ сборка)
- System.Data.SQLite.EF6.dll (опционально, EF6 сборка)
- x86SQLite.Interop.dll (требуется, x86 native interop сборка)
- x64SQLite.Interop.dll (требуется, x64 native interop сборка)
Работа с SQLite из C#
Создадим простое приложение, демонстрирующее работу с SQLite СУБД. В качестве среды разработки будем использовать Visual Studio 2015 Community Edition.
Подготовка
Первое, что мы сделаем, это скачаем с официального сайта пакеты Precompiled Binaries for 64-bit Windows (.NET Framework 4.0) и Precompiled Binaries for 32-bit Windows (.NET Framework 4.0). На момент написания статьи это была версия sqlite-netFx40-binary-x64-2010-1.0.101.0.zip и sqlite-netFx40-binary-Win32-2010-1.0.101.0.zip
В Visual Studio создадим проект Windows Forms Application с именем SQLiteSample.
После этого необходимо собрать проект, для того, чтобы IDE создала необходимый набор каталогов. В нашем случае интерес представляет binDebug. В него добавим необходимый набор файлов, как показано выше в описании структуры папок при использовании подхода Native Library Pre-Loading.
Добавим в проект ссылку на библиотеку System.Data.SQLite.dll, предварительно скопировав ее в папку SQLiteSampleSQLiteSamplelib. Для этого на панели меню выбрать Project/Add Reference… В открывшемся окне нажать кнопку Browse… и выбрать файл System.Data.SQLite.dll. Что привет к появлению нового Reference в окне Solution Explorer.
Приложение будет представлять собой форму для работы с базой данных, содержащей имена писателей и названия их произведений. Внешний вид представлен на рисунке ниже.
На панели инструментов имеются несколько кнопок:
- Create – создание БД и таблицы, если они ещё пока не создана;
- Connect – подключение к БД;
- Read all – считать все записи из таблицы;
- Clear table – очистить таблицу формы;
- Add – добавить запись.
В строке состояния отображается статус:
- Disconnected – нет связи с БД;
- Connected – есть связь с БД.
Создание базы данных, таблиц и работа с данными
Сейчас более подробно рассмотрим процессы создания базы данных, таблиц и работы с записями таблицы (чтение и добавление). Каждая из этих задач будет решаться в рамках метода, вызываемого при нажатии на соответствующую кнопку.
Предварительно подключим в нашем проекте пространство имен System.Data.SQLite и добавим переменные для связи с базой данных. Таким образом наша программа будет иметь вид.
using System; using System.Windows.Forms; using System.Data.SQLite; using System.IO; using System.Data; namespace SQLiteSample < public partial class Form1 : Form < private String dbFileName; private SQLiteConnection m_dbConn; private SQLiteCommand m_sqlCmd; public Form1() < InitializeComponent(); > private void Form1_Load(object sender, EventArgs e) < m_dbConn = new SQLiteConnection(); m_sqlCmd = new SQLiteCommand(); dbFileName = «sample.sqlite»; lbStatusText.Text = «Disconnected»; >> >
Создание БД и таблицы
Создание БД и таблицы в “SQLite Sample”, если они ещё не созданы, осуществляется при нажатии на кнопку Create.
private void btCreate_Click(object sender, EventArgs e) < if (!File.Exists(dbFileName)) SQLiteConnection.CreateFile(dbFileName); try < m_dbConn = new SQLiteConnection(«Data Source=» + dbFileName + «;Version=3;»); m_dbConn.Open(); m_sqlCmd.Connection = m_dbConn; m_sqlCmd.CommandText color: #234a97;»>Catalog (id INTEGER PRIMARY KEY AUTOINCREMENT, author TEXT, book TEXT)»; m_sqlCmd.
ExecuteNonQuery(); lbStatusText.Text = «Connected»; > catch (SQLiteException ex) < lbStatusText.Text = «Disconnected»; MessageBox.Show(«Error: » + ex.Message); > >
В данном методе, мы сначала проверяем, существует ли файл с именем “sample.sqlite” (переменная dbFileName), если его нет, то создаем. Этот файл фактически и является базой данных.
После этого мы подключаемся к созданной БД:
m_dbConn = new SQLiteConnection(«Data Source color: #0b6125;»>»;Version=3;»); m_dbConn.Open();
Для выполнения SQL команд будем использовать переменную m_sqlCmd, чтобы это стало возможным в первую очередь зададим объект класса SqlConnection, используемый SQLiteCommand:
m_sqlCmd.Connection = m_dbConn;
После выполним запрос на создание таблицы:
m_sqlCmd.CommandText = «CREATE TABLE IF NOT EXISTS Catalog (id INTEGER PRIMARY KEY AUTOINCREMENT, author TEXT, book TEXT)»; m_sqlCmd.ExecuteNonQuery();
Подключение к уже существующей таблице
Подключение к уже существующей таблице осуществляется при нажатии на кнопку Connect. Код метода очень похож на тот, что мы разбирали выше, поэтому на нем мы останавливаться не будем.
private void btConnect_Click(object sender, EventArgs e) < if (!File.Exists(dbFileName)) MessageBox.Show(«Please, create DB and blank table (Push «Create» button)»); try < m_dbConn = new SQLiteConnection(«Data Source=» + dbFileName + «;Version=3;»); m_dbConn.
Open(); m_sqlCmd.Connection = m_dbConn; lbStatusText.Text = «Connected»; > catch (SQLiteException ex) < lbStatusText.Text = «Disconnected»; MessageBox.Show(«Error: » + ex.Message); > >
Чтение данных
Чтение данных осуществляется при нажатии на кнопку Read all, при этом из существующей БД считываются все данные и выводятся в таблицу.
private void btReadAll_Click(object sender, EventArgs e) < DataTable dTable = new DataTable(); String sqlQuery; if (m_dbConn.State != ConnectionState.Open) < MessageBox.Show(«Open connection with database»); return; > try < sqlQuery = «SELECT * FROM Catalog»; SQLiteDataAdapter adapter = new SQLiteDataAdapter(sqlQuery, m_dbConn); adapter.
Fill(dTable); if (dTable.Rows.Count > 0) < dgvViewer.Rows.Clear(); for (int i = 0; i < dTable.Rows.Count; i++) dgvViewer.Rows.Add(dTable.Rows[i].ItemArray); > else MessageBox.Show(«Database is empty»); > catch (SQLiteException ex) < MessageBox.
Show(«Error: » + ex.Message); > >
Разберем этот метод более подробно. Первое, что необходимо сделать, это проверить наличие связи с БД:
if (m_dbConn.State != ConnectionState.Open) < MessageBox.Show(«Open connection with database»); return; >
Данные, считанные из базы, мы будем помещать в таблицу DataTable, а из неё будем из перегружать в элемент DataGridView, расположенный на нашей форме. Для этого создадим SQL запрос и адаптер, который будет выполнять запрос и передавать полученные от СУБД данные в таблицу
sqlQuery = «SELECT * FROM Catalog»; SQLiteDataAdapter adapter = new SQLiteDataAdapter(sqlQuery, m_dbConn); adapter.Fill(dTable);
Если таблица не пуста, перенесем данные из нее в элемент dgvViewer.
if (dTable.Rows.Count > 0) < dgvViewer.Rows.Clear(); for (int i = 0; i < dTable.Rows.Count; i++) dgvViewer.Rows.Add(dTable.Rows[i].ItemArray); > else MessageBox.Show(«Database is empty»);
Добавление данных в БД
Добавление данных в БД осуществляется при нажатии на кнопку Add. При этом будет вызван соответствующий метод.
private void btAdd_Click(object sender, EventArgs e) < if (m_dbConn.State != ConnectionState.Open) < MessageBox.Show(«Open connection with database»); return; > AddDataToDb addData = new AddDataToDb(); if (addData.
ShowDialog() == DialogResult.OK) < try < m_sqlCmd.CommandText color: #234a97;»>Catalog (‘author’, ‘book’) values (‘» + addData.Author + «‘ , ‘» + addData.Book + «‘)»; m_sqlCmd.ExecuteNonQuery(); > catch (SQLiteException ex) < MessageBox.Show(«Error: » + ex.Message); > > >
В нем мы также, вначале проверяем, есть ли связь с БД, после этого создает диалоговое окно для ввода имени
12 комментариев
Код хорош. Но он работает только с одной таблицей. А В БД их может быть несколько
В чем сложность все то же самое сделать с несколькими таблицами? Если у вас верно выстроена связь, то это проще простого.
Возможно имел ввиду, что хотел увидеть коннектор вытащенный в отдельный класс, что бы не заниматься его инициацией на каждой форме.
Здравствуй Артём можешь написать программу или бота для ТГ чтобы бот работал с Базами Данных. И по запросу выдавал информацию. Например Запрос: +79001234567 и бот или программа выдавала результаты насчёт этого номера которые хранятся в БД
Да конечно могу. Только я не Артём, а Андрей)
Добрый день, Андрей!
Можешь написать программу на c# и базу данных в sql для салона красоты?
В программе должен быть дизайн, должна работать авторизация, регистрация и редактирование.
Добрый вечер. Да можно, свяжитесь со мной или по почте или в вк.
Пришли почту
Это ужасная реализация. Вам в базу данных можно сделать инъекцию и удалить всю базу данных. В добавлении и изменении просто выполняется sql команда. Человек может просто дописать команду, а после написать дроп датабейс и все, базы нет.
Ну и нафига удалять негативные комментарии, если они правдивы?) Чему ты учишь, выполнять команды в коде? База имеет 0 защиты, иньекция и данных нету
Я их не удаляю, просто плагин стоит, все комментарии проходят модерацию, а я работаю до вечера и не имею возможности контролировать все комментарии. В моем примере продемонстрирована суть подключения к базе данных, и выполнения разных команд. Сам пример это лишь демонстрация взаимодействия работы БД и приложения. На принципах этого примера происходит работа ADO.NET.
Конечно, тут нет защиты от инъекций, потому что так никто вообще уже не работает с БД, уже да же ADO.NET не увидишь, в основном везде EF используется. Если вы это не поняли, ну извините. К чему ваши комментарии я так и не понял, в своем приложении каждый разработчик должен самостоятельно адаптировать код, а не копипастить.