Как вставить запись в несколько таблиц в базе данных

Я сам изучаю C # и SQL Server 2005

У меня есть 3 таблицы в SQL Server 2005, и у меня есть форма на C #, которые принимают входы, которые будут сохранены в базе данных.

Мои 3 таблицы

  • Hotel с колоннами Номер Hotel No, Hotel Name, Location
  • Guest с колоннами Номер Guest No, Guest Name, Address
  • Room с колоннами Room No Room Type, Room Price

и таблицу соединений, где встречаются все три таблицы

  • Booking Hotel No, Guest No, Room No, Date From, Date To

Я установил отношения, что отель No, Guest No, Room No является иностранным ключом к таблице бронирования

В моей форме C # у меня есть код, который заполняет поле со списком для названия отеля и типа номера

 private void FillComboBoxHotelName() { conn.Open(); SqlCommand cmd1 = new SqlCommand("SELECT * FROM Hotel", conn); SqlDataAdapter da = new SqlDataAdapter(cmd1); da.SelectCommand.CommandText = cmd1.CommandText.ToString(); DataTable dt = new DataTable(); da.Fill(dt); cmbHotelName.DataSource = dt; cmbHotelName.DisplayMember = "Hotel Name"; cmbHotelName.ValueMember = "HotelNo"; conn.Close(); } private void FillComboBoxRoomType() { conn.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM Room", conn); SqlDataAdapter da = new SqlDataAdapter(cmd); da.SelectCommand.CommandText = cmd.CommandText.ToString(); DataTable dt = new DataTable(); da.Fill(dt); cmbRoomType.DataSource = dt; cmbRoomType.DisplayMember = "Room Type"; cmbRoomType.ValueMember = "RoomNo"; conn.Close(); } 

Этот код работает, и записи в моих таблицах в гостинице и в комнате заполняют поле со списком в моей форме, теперь моя проблема заключается в том, как сохранить входные значения в форме в моей базе данных. Нужно ли создавать отдельную команду запроса вставки для каждой таблицы, так как данные будут поступать в 3 таблицы, я теряюсь.

Моя форма выглядит так:

 Hotel Name : Combo Box Guest Name: Guest Address: Date From: Date To: Room Type: Button (Save) 

Пожалуйста, помогите, я все еще не могу опубликовать изображение.

Существует два подхода к его достижению. Вставка заявления и хранимые процедуры.

Вставить

  string sql = "INSERT INTO Hotel (Hotel No, Hotel Name, Location) values (@HotelNo,@HotelName,@Location)"; conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.Add("@HotelNo", SqlDbType.Int); cmd.Parameters.Add("@HotelName", SqlDbType.VarChar); cmd.Parameters.Add("@Location", SqlDbType.VarChar); cmd.Parameters["@HotelNo"].Value = HotelNo; // Hotel number name in Int cmd.Parameters["@HotelName"].Value = HotelName;//Hotel Name in string cmd.Parameters["@Location"].Value = Location;//Location in form of text cmd.ExecuteNonQuery(); 

Примечание: здесь, в коде, я сделал некоторые предположения, что Hotel No is Int, название отеля – VarChar, а Location – VarChar.

Аналогичным образом вы можете создать инструкцию Insert для остальных 2 таблиц и вставить код в 2 таблицы.

Хранимая процедура

Создайте хранимую процедуру для всех столбцов, которые вы хотите вставить в базу данных. подобно

 CREATE PROCEDURE yourInsertOperation -- Add the parameters for the stored procedure here @HotelNo INT, @HotelName VARCHAR(20), @Location VARCHAR(20), --......rest of all your parameter list goes here AS BEGIN INSERT INTO resourceTable(column1, column2) VALUES (@HotelNo, @HotelName, @Location ) --Other 2 insert statements will go here End Go 

Как только ваша хранимая процедура будет установлена ​​в вашей базе данных. Вы можете вызвать эту хранимую процедуру вместе с параметрами из кода C #.

  SqlCommand cmd = new SqlCommand("yourInsertOperation",con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@HotelNo", SqlDbType.Int); cmd.Parameters.Add("@HotelName", SqlDbType.VarChar); cmd.Parameters.Add("@Location", SqlDbType.VarChar); //Other columns to insert will go here cmd.Parameters["@HotelNo"].Value = HotelNo; // Hotel number name in Int cmd.Parameters["@HotelName"].Value = HotelName;//Hotel Name in string cmd.Parameters["@Location"].Value = Location;//Location in form of text //Values for columns will go here cmd.ExecuteNonQuery(); 

Подводя итог, я предлагаю вам перейти с помощью запроса Insert, поскольку он будет легким и быстрым подходом к вставке в базу данных. И в этом вам не нужно прилагать усилия для создания SP. Но все же у вас есть выбор использовать любой или оба подхода, как вы это делаете для обучения.

Существует несколько способов решить ваш вопрос:

  1. Создайте триггер на вставке в таблице «Бронирование», в котором будут заполнены остальные связанные таблицы

  2. Поместите вставку SQL в свой C # для каждой вовлеченной таблицы, а не лучший способ сделать это, но это можно сделать.

  3. Создайте процедуру хранения, чтобы сделать вставку во все 4 таблицы последовательно. Вызовите этот SP из своего кода на C #.

Я предпочел бы использовать 3 или 1 опции в порядке предпочтения.

Interesting Posts

TSQL: Как сделать самостоятельное объединение в XML для получения вложенного документа?

Как скрыть дату и идентификатор из таблицы

Запустить SQL хранимую процедуру для каждого значения в массиве

Размер файла для размера datbase в sql-сервере

Требуется откат в SQL Server при неудачной транзакции в транзакции commit tran

Почему запрос SQL Server работает по-разному на разных серверах?

Ссылка на объект при создании страницы в Kentico CMS версии 7

ОБНОВЛЕНИЕ из таблицы в основной хранимой процедуре SQL (Hekaton)

Добавление ограничений именованного внешнего ключа в инструкции SQL Create

SQL Server: при запросе на столбец XML я могу вернуть столбец XML?

Найти последнюю дату в результирующем наборе

Report Viewer SP 1 и Chrome / Safari

Как игнорировать строки из tbl2, а главная таблица – tbl1 в sql?

Обновление с помощью внутреннего соединения

Подключить Sharepoint 2010 (внешний тип контента) к MSSQL Linked Server

Давайте будем гением компьютера.