Шаг 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 и последовательность должна точно совпадать. но *
Какой операционной системы вы пользуетесь? Oracle? –
Возможный дубликат [Как получить последний вставленный идентификатор?] (Http://stackoverflow.com/questions/5228780/how-to-get-last-inserted-id) –
Я предполагаю, что ваша проблема связана с ограничение внешнего ключа от 'Client' до' Reservation'. Знаете ли вы, что такое внешние ключи и как они работают? –