2013-09-05 2 views
0

У меня есть 2 таблицы:вставки на две таблицы

  1. БРОНИРОВАНИЕ

    ID, DATE, TIME, TABLE

  2. КЛИЕНТ

    ID_CLIENT, FNAME, LNAME, EMAIL, PHONE, FK_RESERVATION

Я работаю INSERT заявление на резервирование table-

string insertSql = "INSERT INTO Rezervacija (date,time,table) VALUES (@date,@time,@table); 
SqlCommand cmd = new SqlCommand(insertSql, con); 

cmd.Parameters.AddWithValue("@date", txtDate.Text); 
cmd.Parameters.AddWithValue("@time", ddlTime.SelectedItem.Text); 
cmd.Parameters.AddWithValue("@table", ddlTable.SelectedItem.Text); 

Но проблема возникает с INSERT INTO Client Table Foreign Key.

Может ли кто-нибудь помочь мне вставить данные в две связанные таблицы.

+0

Какой операционной системы вы пользуетесь? Oracle? –

+0

Возможный дубликат [Как получить последний вставленный идентификатор?] (Http://stackoverflow.com/questions/5228780/how-to-get-last-inserted-id) –

+0

Я предполагаю, что ваша проблема связана с ограничение внешнего ключа от 'Client' до' Reservation'. Знаете ли вы, что такое внешние ключи и как они работают? –

ответ

2

Вам нужно будет изменить свой запрос, чтобы получить идентификатор строки, которую вы только что вставили.

string insertSql = "INSERT INTO Rezervacija (date,time,table) OUTPUT INSERTED.Id VALUES (@date,@time,@table);" 
SqlCommand cmd = new SqlCommand(insertSql, con); 

cmd.Parameters.AddWithValue("@date", txtDate.Text); 
cmd.Parameters.AddWithValue("@time", ddlTime.SelectedItem.Text); 
cmd.Parameters.AddWithValue("@table", ddlTable.SelectedItem.Text); 

var **reservationId** = (int)cmd.ExecuteScalar() 

string insertSql2 = "INSERT INTO CLIENT (ID_CLIENT,FNAME,LNAME,EMAIL,PHONE,FK_RESERVATION) VALUES (@clientId, @fname, @lname, @email, @phone, @reservation" 

SqlCommand cmd2 = new SqlCommand(insertSql2, con); 
cmd.Parameters.AddWithValue("@clientId", clientId); 
cmd.Parameters.AddWithValue("@fname", fname); 
cmd.Parameters.AddWithValue("@lname", lname); 
cmd.Parameters.AddWithValue("@email", email); 
cmd.Parameters.AddWithValue("@phone", phone); 
cmd.Parameters.AddWithValue("@reservation", **reservationId**); 

Это позволит вам использовать Inserted.Id во втором запросе, поскольку вы вернули результат в переменную.

+0

Я забыл добавить, TABLE - это ключевое слово в SQL, поэтому вам придется изменить его на [table]. –

+0

Он работает, спасибо! – McKeymayker

-1

Шаг 1: Создать Sp, а не встроенный запрос.

Create Proc MakeReservation 
(
    @PDATE DATA_TYPE(LENGTH) | DATA_TYPE, // it means your actual data type defined in schema 
    @PTIME DATA_TYPE(LENGTH) | DATA_TYPE, 
    @PTABLE DATA_TYPE(LENGTH) | DATA_TYPE, 
    @PFNAME DATA_TYPE(LENGTH) | DATA_TYPE, 
    @PLNAME DATA_TYPE(LENGTH) | DATA_TYPE, 
    @PEMAIL DATA_TYPE(LENGTH) | DATA_TYPE, 
    @PPHONE DATA_TYPE(LENGTH) | DATA_TYPE 


) 
AS 
BEGIN TRY 
    BEGIN TRANSACTION 

    INSERT INTO RERSERVATION (ID,DATE,TIME,TABLE) VALUES (@PDATE,@PTIME,@PTABLE) //ASSUMING ID IS AUTOGENERATED 
DECLARE @KEY AS INT 
SET @KEY = @@IDENTITY 

INSERT INTO CLIENT (FNAME,LNAME,EMAIL,PHONE,FK_RESERVATION) VALUES (@PFNAME,@PLNAME,@PEMAIL,@PPHONE,@KEY) 

    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    IF @@ERROR > 0 
     ROLLBACK TRANSACTION 
END CATCH 

Теперь ваш код CS будет выглядеть следующим образом. Я довольно ленив здесь, в форматировании и кодировании обоих. Поэтому я могу что-то пропустить. Пожалуйста, несите :).

string insertSql = "MakeReservation" 

SqlCommand cmd2 = new SqlCommand(insertSql, con); 

cmd.Parameters.AddWithValue("@date", txtDate.Text); 
cmd.Parameters.AddWithValue("@time", ddlTime.SelectedItem.Text); 
cmd.Parameters.AddWithValue("@table", ddlTable.SelectedItem.Text); 
cmd.Parameters.AddWithValue("@clientId", clientId); 
cmd.Parameters.AddWithValue("@fname", fname); 
cmd.Parameters.AddWithValue("@lname", lname); 
cmd.Parameters.AddWithValue("@email", email); 
cmd.Parameters.AddWithValue("@phone", phone); 
cmd.Parameters.AddWithValue("@reservation", reservationId); 

con.Open(); 
cmd.ExecuteNonQuery(); 

* Пожалуйста, обратите внимание на выше коде имя параметра вашего SP и последовательность должна точно совпадать. но *

+1

Это активно плохое решение, потому что: 1) Вы предлагаете использовать OP без необходимости. 2) Вы не должны использовать @@ IDENTITY из-за проблемы с триггерами, вместо этого вы должны использовать SCOPE_IDENTITY(), но только если вы находитесь на SQL 2000, потому что ... 3) Оба @@ IDENTITY и SCOPE_IDENTITY разбиты на более поздние версии SQL Server (в зависимости от уровня патча), когда включен параллельный план Mulit. –

+0

@ConradFrix Сначала посмотрите уровень OP из его кода и репутации. Если мы рассмотрим эффективность и оптимизацию кода для новичков, то я соглашусь .. это был действительно не идеальный ответ. Но я не думаю, что SP - это плохая идея, если вы собираетесь писать запросы с линией более 5 или 6 –

+0

. Мое мнение заключалось в том, что вам не нужно использовать SP. Из вашего ответа можно сделать вывод, что вы должны использовать SP, который является моей проблемой. Квалифицируйте, что это предпочтение, если это то, что вы имели в виду. Игнорируя это, использование @@ IDENTITY не было хорошей идеей для долгого времени. См. Статью 4/2003 [Управление кризисом @@ IDENTITY] (http://msdn.microsoft.com/en-us/library/ms971502.aspx) или [msdn docs] (http://technet.microsoft.com/en-us/library/ms187342.aspx) на @@ IDENTITY, оба из которых говорят вам использовать SCOPE_IDENITYT(). И примечательно, что ни одно из них не столь надежно, как предложение OUTPUT –

Смежные вопросы