Полная ошибка: поставщик данных .Net SqlClient. Оператор INSERT вступил в конфликт с ограничением FOREIGN KEY "FK_SalesOrder_SalesOrderHead". Конфликт произошел в базе данных «ControlSecurity», таблице «dbo.SalesOrderHead», столбце «id».
Информация о таблице БД: FK_SalesOrder_SalesOrderHead (отношение) имеет идентификатор первичного ключа из SalesOrderHead и FK = SalesOrderID.
SalesOrderInsert(Stored Procedure)
[dbo].[SalesOrderInsert]
@SalesOrder udtSalesOrder readonly
AS
BEGIN
INSERT INTO SalesOrder
(ProductID,Quantity,UnitPrice,SalesOrderID)
SELECT ProductID,Quantity,UnitPrice,SalesOrderID
FROM @SalesOrder
END
Определяемая пользователем таблица* Таблица. Все это в одной транзакции в коде C #. Но похоже, что второй ExecuteNonQuery не знает, что он является частью транзакции, или мое понимание области транзакции неверно. Должен ли я разместить запрос хранимой процедуры здесь. Я не уверен.
using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["dbconn"].ToString()))
{
try
{
con.Open();
using (var tran = con.BeginTransaction())
{
try
{
SqlCommand cmd = new SqlCommand("Insert into SalesOrderHead(cust_id,Description,OrderDate,DeliveryDate,Priority,CustomerRef) VALUES(@cust_id,@Description,@OrderDate,@DeliveryDate,@Priority,@CustomerRef) SELECT @id = CAST(SCOPE_IDENTITY() AS int)",con,tran);
cmd.Parameters.AddWithValue("@cust_id", CustomersList.EditValue);
cmd.Parameters.AddWithValue("@Description", Remarks.Text);
cmd.Parameters.AddWithValue("@OrderDate", OrderDate.DateTime);
cmd.Parameters.AddWithValue("@DeliveryDate", DeliveryDate.DateTime);
cmd.Parameters.AddWithValue("@Priority", PriorityComboBox.Text);
cmd.Parameters.AddWithValue("@CustomerRef", CustomerRef.Text);
cmd.Parameters.AddWithValue("@id", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
var SalesOrderHeadID = cmd.Parameters["@id"].Value;
cmd.Parameters.Clear();
cmd.CommandText = "SalesOrderInsert";
//cmd = new SqlCommand("SalesOrderInsert", con, tran);
//cmd.Transaction = tran;
cmd.CommandType = CommandType.StoredProcedure;
//Add from SalesOrderTB to SalesOrder stored procedure
cmd.Parameters.AddWithValue("@SalesOrder", SalesOrderTB);
cmd.ExecuteNonQuery();
// Record inserted in both table
tran.Commit();
XtraMessageBox.Show("Added to database success");
con.Close();
}
catch (SqlException ex)
{
tran.Rollback();
Console.WriteLine(ex.Source + ex.Message);
}
}
}
catch (Exception)
{
throw;
}
}