Создание базы данных sqlite visual studio
В этой части будут затронуты непростые вопросы использования SQLite через работу с его программным интерфейсом (API).
Что такое SQLite API? Это набор функций sqlite3_XXX на языке C.
Заголовки этих функций находятся в sqlite3.h, а описание API в виде одного большого HTML находится тут.
Мы начнем использовать API, а позднее плавно перейдем к вопросам оборачивания его в уютный фреймворк.
Попробуем создать небольшой проект на C++ (я делал в MS Visual Studio), который что-то делает с SQLite базой.
Использовать SQLite в своем проекте можно двумя способами.
«Вкомпилировать» код (если это C или C++). Или загружать и использовать sqlite3.dll (позволяет легко обновлять SQLite и не привязан к языку).
В любом случае, надо создать новый проект (консольного) приложения (я использовал MS Visual Studio) и добавить в него вот такой main.cpp:
const char * SQL = "CREATE TABLE IF NOT EXISTS foo(a,b,c); INSERT INTO FOO VALUES(1,2,3); INSERT INTO FOO SELECT * FROM FOO;" ;
int main ( int argc , char ** argv )
sqlite3 * db = 0 ; // хэндл объекта соединение к БД
char * err = 0 ;
// открываем соединение
if ( sqlite3_open ( "my_cosy_database.dblite" , & db ) )
fprintf ( stderr , "Ошибка открытия/создания БД: %s\n" , sqlite3_errmsg ( db ) ) ;
// выполняем SQL
else if ( sqlite3_exec ( db , SQL , 0 , 0 , & err ) )
<
fprintf ( stderr , "Ошибка SQL: %sn" , err ) ;
sqlite3_free ( err ) ;
>
// закрываем соединение
sqlite3_close ( db ) ;
return 0 ;
>
Далее, если мы желаем собрать проект вместе с кодом SQLite, то надо:
— скачать исходный код в виде amalgamation;
— извлечь из него sqlite3.h и sqlite3.c и добавить их в проект.
Если же мы хотим использовать sqlite3.dll, необходимо:
— скачать SQLite DLL и распаковать;
— выполнить «LIB.EXE /DEF:sqlite3.def» в папке куда распаковали для получения sqlite3.lib (убедитесь, что пути к lib.exe прописаны через вызов vcvars32.bat);
— включить в проект sqlite3.lib;
— скачать amalgamation и извлечь из него sqlite3.h;
— включить в проект sqlite3.h;
Компилируем, выполняем (во втором случае, DLL должна быть доступна для исполняемого файла).
При первом запуске будет создан файл «my_cosy_database.dblite» с БД, в нем — одна таблица и две записи в ней.
При последующих запусках — программа будет присоединяться к уже существующей БД и удваивать число записей в таблице.
Давайте разбираться с кодом проекта.
Использование SQLite предполагает, что мы хотим выполнять команды на языке SQL в какой-то БД (Ваш К.О.!).
Можно представить работу с SQLite базой как работу с файлами в ОС Windows. Мы открываем файл и получаем _хэндл_ файла, к которому «привязан» некий системный объект (файл). Передавая этот хэндл в различные функции мы просим систему что-то сделать с файлом. Затем — закрываем файл. Также и в SQLite. Мы открываем файл с БД и получаем хэндл объекта «соединение к БД». Затем мы исполняем некие SQL команды через вызовы функций, получающих этот хэндл, и, в конце, закрываем соединение.
Ничего оригинального, особенного или хитрого, как видим, тут нет.
Расширение файла с БД SQLite не стандартизовано. Некоторые делают его ".sqlite3", но можно поставить любое.
int sqlite3_open (
const char * filename , /* Database filename (UTF-8) */
sqlite3 ** ppDb /* OUT: SQLite db handle */
) ;
создает или открывает БД в указанном файле (UTF-8!) и заносит хендл соединения в db. Она возвращает 0 (успех) или код ошибки. Закрывающий вызов sqlite3_close нужен в любом случае (даже при ошибке sqlite3_open).
int sqlite3_exec (
sqlite3 *, /* An open database */
const char * sql , /* SQL to be evaluated (UTF-8) */
int ( * callback ) ( void *, int , char **, char ** ) , /* Callback function */
void *, /* 1st argument to callback */
char ** errmsg /* Error msg written here */
) ;
выполняет команду SQL (состояющую из одного или нескольких операторов SQL в UTF-8, разделенных ";") в контексте указанного (открытого) соединения к БД.
Функция обратного вызова (callback) и custom аргумент к ней нужны, если делается SELECT (для извлечения данных). Об этом позже, пока не используем.
В параметре errmsg можно получить текст ошибки и позднее очистить его через sqlite3_free. Если передать здесь NULL, то текста ошибки не получим.
Как и sqlite3_open возвращается 0 или код ошибки.
Команда «CREATE TABLE» содержит уточнение «IF NOT EXISTS». Это означает, что таблица создается, если ее — нет. Если есть, то ничего не происходит (и нет ошибки).
Собственно, вот и все. Несмотря на то, что в реальных проектах не используются ни sqlite3_open (есть более мощный вызов sqlite3_open_v2), ни sqlite3_exec (обычно используется связка вызовов, компилирующих SQL, привязывающих параметры и пр.) это вполне рабочий проект.
Он несет и еще одну важную миссию. Как уже было сказано при каждом запуске он удваивает кол-во строк в таблице foo. После 20 запусков в таблице будет ~2 млн записей.
Т.е. 21-й запуск вставляет ~2 млн записей.
На моей машине (Windows 7 x64, i5 2.8 Ghz, HDD, не SSD ) это заняло ~ 15 секунд. Пускай это убогий и синтетический тест, но он все-таки дает определенное представление о производительности SQLite.
Исходный код доступен на GitHub.
Введение в SQLite
Если кратко, то SQLite – это кроссплатформенная встраиваемая СУБД. Свойство кроссплатформенности я думаю пояснять не нужно, а вот с понятием “встраиваемая” наверное стоит немного разобраться. Существуют СУБД, которые представляют собой клиент-серверное приложение – это наиболее знакомый вариант. Например Microsoft SQL Server, MySQL, PostgreSQL, различные NoSQL варианты, которых на сегодняшний день появилось огромное количество. Суть их в том, что есть выделенное приложение – сервер, которое принимает запросы от клиентов и выполняет их, оно непосредственно занимается записью/чтением данных на диск и предоставляет различные функции типа репликации и т.п. Встраиваемая СУБД не имеет выделенного сервера, ее движок включается в приложение в виде библиотеки и предоставляет доступ к базе через специализированный API.
- если в названии пакета для скачивания нет слова “static”, то это значит, что на машине разработчика и пользователя приложения должна стоять Microsoft Visual C++ Runtime Library (2005, 2008, 2010, 2012, 2013 или 2015).
- если в названии есть слово “setup”, то он включает в себя и автоматически устанавливает на машину Microsoft Visual C++ Runtime Library.
- пакет со словом “bundle”, используется в том случае, если библиотеки необходимо разместить в Global Assembly Cache
Сами разработчики рекомендуют брать во внимание следующие моменты при выборе дистрибутива SQLite:
Структура папки, в которой располагается приложение, для поддержки режима автоматической подгрузки нужных библиотек (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 сборка)
- \x86\SQLite.Interop.dll (требуется, x86 native interop сборка)
- \x64\SQLite.Interop.dll (требуется, x64 native interop сборка)
Создадим простое приложение, демонстрирующее работу с SQLite СУБД. В качестве среды разработки будем использовать Visual Studio 2015 Community Edition.
Подготовка
В Visual Studio создадим проект Windows Forms Application с именем SQLiteSample.
После этого необходимо собрать проект, для того, чтобы IDE создала необходимый набор каталогов. В нашем случае интерес представляет \bin\Debug. В него добавим необходимый набор файлов, как показано выше в описании структуры папок при использовании подхода Native Library Pre-Loading.
Добавим в проект ссылку на библиотеку System.Data.SQLite.dll, предварительно скопировав ее в папку SQLiteSample\SQLiteSample\lib. Для этого на панели меню выбрать Project/Add Reference… В открывшемся окне нажать кнопку Browse… и выбрать файл System.Data.SQLite.dll. Что привет к появлению нового Reference в окне Solution Explorer.
Приложение будет представлять собой форму для работы с базой данных, содержащей имена писателей и названия их произведений. Внешний вид представлен на рисунке ниже.
На панели инструментов имеются несколько кнопок:
- Create – создание БД и таблицы, если они ещё пока не создана;
- Connect – подключение к БД;
- Read all – считать все записи из таблицы;
- Clear table – очистить таблицу формы;
- Add – добавить запись.
В строке состояния отображается статус:
- Disconnected – нет связи с БД;
- Connected – есть связь с БД.
Создание базы данных, таблиц и работа с данными
Сейчас более подробно рассмотрим процессы создания базы данных, таблиц и работы с записями таблицы (чтение и добавление). Каждая из этих задач будет решаться в рамках метода, вызываемого при нажатии на соответствующую кнопку.
Предварительно подключим в нашем проекте пространство имен System.Data.SQLite и добавим переменные для связи с базой данных. Таким образом наша программа будет иметь вид.
Создание БД и таблицы
Создание БД и таблицы в “SQLite Sample”, если они ещё не созданы, осуществляется при нажатии на кнопку Create.
В данном методе, мы сначала проверяем, существует ли файл с именем “sample.sqlite” (переменная dbFileName), если его нет, то создаем. Этот файл фактически и является базой данных.
После этого мы подключаемся к созданной БД:
Для выполнения SQL команд будем использовать переменную m_sqlCmd, чтобы это стало возможным в первую очередь зададим объект класса SqlConnection, используемый SQLiteCommand:
После выполним запрос на создание таблицы:
Подключение к уже существующей таблице
Подключение к уже существующей таблице осуществляется при нажатии на кнопку Connect. Код метода очень похож на тот, что мы разбирали выше, поэтому на нем мы останавливаться не будем.
Чтение данных
Чтение данных осуществляется при нажатии на кнопку Read all, при этом из существующей БД считываются все данные и выводятся в таблицу.
Разберем этот метод более подробно. Первое, что необходимо сделать, это проверить наличие связи с БД:
Данные, считанные из базы, мы будем помещать в таблицу DataTable, а из неё будем из перегружать в элемент DataGridView, расположенный на нашей форме. Для этого создадим SQL запрос и адаптер, который будет выполнять запрос и передавать полученные от СУБД данные в таблицу
Если таблица не пуста, перенесем данные из нее в элемент dgvViewer.
Добавление данных в БД
Добавление данных в БД осуществляется при нажатии на кнопку Add. При этом будет вызван соответствующий метод.
В нем мы также, вначале проверяем, есть ли связь с БД, после этого создает диалоговое окно для ввода имени автора и названия произведения.
Если окно было закрыто по кнопку OK, то записываем введенные данные в БД
На этом можно завершить описание базовых понятий и методов работы с СУБД SQLite.
Спасибо за внимание!
Например Microsoft SQL Server, MySQL, PostgreSQL, различные NoSQL варианты, который на сегодняшний день появилось огромное количество.
которых – поправьте, пожалуйста
Привет, у тебя нет проблем с поиском кириллических символов в базе? У меня почему-то совсем не ищет
Добрый день! Нет, с такой проблемой не сталкивался. Попробую посмотреть, если что-то найду интересное – напишу.
Здравствуйте. У меня компилятор ругается на то, что не находит пространство имен для AddDataToDb…Что делать?
Просто скачал проект с гитхаба и пробую запустить.
Нужно установить Microsoft Visual C++ 2010
Не ясно как определить lbStatusText.Text. Явно в проекте lbStatusText.Text не определена, а других пояснений нет.
Вот скажите человек пытается разобраться БД, а вы еще ему тему со StatusStrip подбрасываете. В вашем примере lbStatusText.Text не определена. Нужно лезть подключать StatusStrip. А это совсем другая опера. Нельзя ли сделать этот пример без StatusStrip?
Полезная статья, однако, не раскрыта тема команды Update. Т.е изменение данных в таблице формы, и перенос этих изменений в базу.
Здравствуйте.
Подскажите пожалуйста, как мне прочитать данные из ячейки, находящейся в определённом столбце?
К примеру, есть таблица из 4 столбцов: title, discription, date, sirial
Допустим мне нужно прочитать данные из 6-ой строки столбца description
Скажите пожалуйста, как правильно сформировать запрос к базе и вывести результат например в MessageBox?
Большое спасибо
В некоторых проектах достаточно часто возникает необходимость в хранении данных, объем которых уже нельзя назвать маленьким, но в тоже время использовать какую-либо СУБД слишком накладно из-за сложности развертывания приложения. И тут на помощь приходит такая прекрасная вещь как SQLite – компактная встраиваемая база данных.
С чего начать
Если вы используете среду разработки Visual Studio (в частности версию 2008), то вам может так же пригодиться SQLite Designer, который дает возможность использовать визуальные средства для работы с базами SQLite: построитель запросов (Query Builder), редактирование таблиц и ряд других возможностей.
Ну и в дополнение ко всему в поставку библиотеки провайдера входит сборка System.Data.SQLite.Linq.dll, которая обеспечивает доступ к технологии LINQ.
Создание базы данных SQLite
class Program
static void Main( string [] args)
string baseName = "CompanyWorkers.db3" ;
public sealed class SQLiteFactory : DbProviderFactory, IServiceProvider
public sealed class SQLiteConnection : DbConnection, ICloneable
Убедиться в том, что база в действительности была создана можно с помощью уже упомянутого Server Explorer, просто создав соединение к файлу базы:
Рис. 1. Просмотр базы данных CompanyWorkers через Server Explorer
Редактирование базы данных SQLite
namespace DataEditor
public partial class _Default : System.Web.UI. Page
private void GridViewDataBind()
//Обновляем данные в GridView1
this .GridView1.DataBind();
>
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();
>
>
>
Теперь приложение полностью готово к использованию. Окончательный вид редактора для редактирование таблицы workers из базы CompanyWorkers.db3:
Рис. 5. Редактор, готовый к работе.
Благодаря использованию SQLite мне не понадобилось разворачивать каких-либо служб для работы с базой.
Заключение
Думаю, возможностей SQLite должно хватить для достаточного обширного круга задач. В тоже время не стоит пытаться использовать её в каких-либо серьёзных проектах с очень большими объёмами данных и большим количеством пользователей, так как данная СУБД для этого не предназначена: в ней отсутствует поддержка многопроцессорности и ограничены уровни изоляций для транзакций. В общем, для средних проектов, типа базы данных небольшой компании или телефонного справочника, самое подходящее средство.
P.S.: В своих примерах я использовал x86-версию сборки System.Data.SQLite.dll.
В своих попытках решить такую элементарную на первый взгляд задачу, как разработка минимального демонстрационного приложения WinForms с использованием EF Core в VisualStudo 2015 я натолкнулся на целый проблем типа исключений, неожиданного поведения, непонимания как сделать нечто, что в туториалах подразумевается как самоочевидное и т.п. В результате некоторые шаги из тех, что я приведу ниже пришлось нащупывать практически в слепую, гугля, задавая вопросы и экспериментируя.
3. Обновляем расширение Visual Studio для работы с репозиториями NuGet. Для этого либо скачиваем актуальную на данный момент версию 3.5.0.1996 по прямой ссылке либо добавляем в настройки Visual Studio соответствующий репозиторий расширений для автоматического обновления.
5. Нажимаем правой кнопкой мыши по нашему проекту в панели Solution Explorer, выбираем Manage NuGet Packages. переходим на вкладку Browse, устанавливаем Microsoft.EntityFrameworkCore.Sqlite.Design и Microsoft.EntityFrameworkCore.Tools. Для установки актуальных версий может потребоваться установить галочку «Include prerelease», в стабильных версиях может чего-то не хватать или наличествовать неисправленные баги. Я установил последние на данный момент Microsoft.EntityFrameworkCore.Sqlite.Design 1.1.0 и Microsoft.EntityFrameworkCore.Tools 1.1.0-preview4-final. Если возникнут проблемы с установкой Microsoft.EntityFrameworkCore.Tools можно попробовать сделать это через командную строку NuGet: в меню выбрать Tools — NuGet Package Manager — Package Manager Console, в появившейся консоли (которая, кстати, ещё понадобится нам далее) после приглашения «PM>» ввести «Install-Package Microsoft.EntityFrameworkCore.Tools -Pre»
6. Создаём файлы исходного кода классов модели данных. Для порядка я поместил их в подпапку «Model» (некоторые называют её «Entities», некоторые кидают все классы в корень проекта, а некоторые и вовсе в один файл). Модель описывает учебный пример базы данных, хранящей список городов и людей в/из них. Каждый человек может быть связан только с одним городом, может быть неизвестно из какого он города вообще.
Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContext.cs
7. Разрешаем скрипты PowerShell, если этого не сделать может возникнуть ошибка ". \packages\Microsoft.EntityFrameworkCore.Tools.1.1.0-preview4-final\tools\init.ps1 cannot be loaded because running scripts is disabled on this system." Для этого переходим в командную строку NuGet (выбрать Tools — NuGet Package Manager — Package Manager Console в меню) и выполняем следующую команду
8. Создаём «миграции». Для этого, сохранив и откомпилировав наш код (просто чтобы удостовериться в отсутствии явных опечаток) переходим в командную строку NuGet и выполняем следующую команду.
в результате у нас в проекте должна появиться папка «Migrations» и два файла в ней: «Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContextModelSnapshot.cs» и «20170304204355_Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleMigration.cs» (разумеется число в начале последнего у вас будет другое — это ни что иное, как дата и время в момент генерации в очевидном формате, я её потом вообще удалил оставив только «Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleMigration.cs»).
9. Редактируем сгенерированные файлы чтобы добавить условие уникальности (unique constraint, также известное как вторичный ключ) на имя города (в реальности, конечно, бывают города с одинаковыми именами, но для примера будет не лишним)
Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleMigration.cs
Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContextModelSnapshot.cs
10. Генерируем файл БД. Для этого в командной строке NuGet выполняем следующую команду
Файл БД создастся в той же директории, где находится скомпилированный exe-шник нашего приложения, у меня это ". \Vs2015WinFormsEfcSqliteCodeFirst20170304Example\bin\Debug\Vs2015WinFormsEfcSqliteCodeFirst20170304Example.sqlite".
На данном этапе мы уже можем заглянуть внутрь созданного файла, например с помощью официального консольного клиента sqlite3 или бесплатной кроссплатформенной GUI оболочки DB Browser for SQLite, и удостовериться, что таблицы создались корректно. Помимо наших таблиц «Cities» и «People» мы также найдём там таблицу «__EFMigrationsHistory» со служебной информацией EF Core и «sqlite_sequence» со служебной информацией SQLite.
11. Теперь перейдём к дизайнеру нашей формы, разместим на ней кнопочку, щёлкнем и на ней дважды чтобы создать обработчик события нажатия на кнопку и перейти к редактированию его кода. Ниже привожу свой код, демонстрирующий основные действия с записями БД. Я ещё имею привычку всегда переименовывать Form1 в MainForm и контролы аналогично по смыслу (в данном случае единственный контрол button1 в mainButton), но это дело вкуса и принятых в вашей команде стандартов именования.
Разумеется в реальной жизни вы реализуете в приложении более богатый интерфейс, более осмысленную логику, добавите обработку исключений и валидацию данных для их предотвращения, приведённого же примера достаточно для понимания того, как это сделать.
You can use Visual Studio to create and update a local database file in SQL Server Express LocalDB. You can also create a database by executing Transact-SQL statements in the SQL Server Object Explorer tool window in Visual Studio. In this topic, we'll create an .mdf file and add tables and keys by using the Table Designer.
Prerequisites
Create a project and a local database file
On the menu bar, select Project > Add New Item.
In the list of item templates, scroll down and select Service-based Database.
Name the database SampleDatabase, and then click Add.
Add a data source
If the Data Sources window isn't open, open it by pressing Shift+Alt+D or selecting View > Other Windows > Data Sources on the menu bar.
In the Data Sources window, select Add New Data Source.
The Data Source Configuration Wizard opens.
On the Choose a Data Source Type page, choose Database and then choose Next.
On the Choose a Database Model page, choose Next to accept the default (Dataset).
On the Choose Your Data Connection page, select the SampleDatabase.mdf file in the drop-down list, and then choose Next.
On the Save the Connection String to the Application Configuration File page, choose Next.
On the Choose your Database Objects page, you'll see a message that says the database doesn't contain any objects. Choose Finish.
View properties of the data connection
You can view the connection string for the SampleDatabase.mdf file by opening the Properties window of the data connection:
Select View > SQL Server Object Explorer to open the SQL Server Object Explorer window. Expand (localdb)\MSSQLLocalDB > Databases, and then right-click on SampleDatabase.mdf and select Properties.
Alternatively, you can select View > Server Explorer, if that window isn't already open. Open the Properties window by expanding the Data Connections node, right-clicking on SampleDatabase.mdf, and then selecting Properties.
If you can't expand the Data Connections node, or the SampleDatabase.mdf connection is not listed, select the Connect to Database button in the Server Explorer toolbar. In the Add Connection dialog box, make sure that Microsoft SQL Server Database File is selected under Data source, and then browse to and select the SampleDatabase.mdf file. Finish adding the connection by selecting OK.
Create tables and keys by using Table Designer
In this section, you'll create two tables, a primary key in each table, and a few rows of sample data. You'll also create a foreign key to specify how records in one table correspond to records in the other table.
Create the Customers table
In Server Explorer, expand the Data Connections node, and then expand the SampleDatabase.mdf node.
If you can't expand the Data Connections node, or the SampleDatabase.mdf connection is not listed, select the Connect to Database button in the Server Explorer toolbar. In the Add Connection dialog box, make sure that Microsoft SQL Server Database File is selected under Data source, and then browse to and select the SampleDatabase.mdf file. Finish adding the connection by selecting OK.
Right-click on Tables and select Add New Table.
The Table Designer opens and shows a grid with one default row, which represents a single column in the table that you're creating. By adding rows to the grid, you'll add columns in the table.
In the grid, add a row for each of the following entries:
Right-click on the CustomerID row, and then select Set Primary Key.
Right-click on the default row ( Id ), and then select Delete.
Name the Customers table by updating the first line in the script pane to match the following sample:
Add an index constraint to the Customers table. Add a comma at the end of the Phone line, then add the following sample before the closing parenthesis:
You should see something like this:
In the upper-left corner of Table Designer, select Update, or press Shift+Alt+U.
In the Preview Database Updates dialog box, select Update Database.
The Customers table is created in the local database file.
Create the Orders table
Add another table, and then add a row for each entry in the following table:
Set OrderID as the primary key, and then delete the default row.
Name the Orders table by updating the first line in the script pane to match the following sample:
Add an index constraint to the Customers table. Add a comma at the end of the OrderQuantity line, then add the following sample before the closing parenthesis:
In the upper-left corner of the Table Designer, select Update, or press Shift+Alt+U..
In the Preview Database Updates dialog box, select Update Database.
The Orders table is created in the local database file. If you expand the Tables node in Server Explorer, you see the two tables:
If you don't see it, hit the Refresh toolbar button.
Create a foreign key
In the context pane on the right side of the Table Designer grid for the Orders table, right-click on Foreign Keys and select Add New Foreign Key.
In the text box that appears, replace the text ToTable with Customers.
In the T-SQL pane, update the last line to match the following sample:
In the upper-left corner of the Table Designer, select Update (Shift+Alt+U).
In the Preview Database Updates dialog box, select Update Database.
The foreign key is created.
Populate the tables with data
In Server Explorer or SQL Server Object Explorer, expand the node for the sample database.
Open the shortcut menu for the Tables node, select Refresh, and then expand the Tables node.
Open the shortcut menu for the Customers table, and then select Show Table Data or View Data.
Add whatever data you want for some customers.
You can specify any five characters you want as the customer IDs, but choose at least one that you can remember for use later in this procedure.
Open the shortcut menu for the Orders table, and then select Show Table Data or View Data.
Add data for some orders. As you enter each row, it is saved in the database.
Make sure that all order IDs and order quantities are integers and that each customer ID matches a value that you specified in the CustomerID column of the Customers table.
Congratulations! You now know how to create tables, link them with a foreign key, and add data.
Читайте также: