系统需要往订单主表中插入信息返回一个自增的id,之后再往明细表中插入各个商品信息。现在问题是,如果主表插入成功,明细表插入失败,我怎么处理才能把所有数据返回,保障数据完整性。
谢谢各位高手了,请附上代码。
下面是插入主表存储过程
PROCEDURE dbo.Proc_OrdMa
(
@ItemsFee float,
@ItemsNum int,
@Name nvarchar(50),
@OrderID int output
)
as
Insert into TSa_Order
(ItemsFee,ItemsNum,ReceiverName)
values
(@ItemsFee,@ItemsNum,@Name)
select @OrderID=@@identity
下面是插入明细表存储过程
PROCEDURE dbo.Proc_OrdDt
@ItemID int,
@Num int,
@OrderID int,
@TotailPrice float,
@Remark varchar(200)
as
Insert into TSa_OrderDt
(ItemID,Num,OrderID,TotailPrice,Remark)
values
(@ItemID,@Num,@OrderID,@TotailPrice,@Remark)
下面是.net后台代码
写了一个公共类OrderClass
//处理单据主表数据插入
public int OrderMa(params SqlParameter[] Parameters)
{
string s_sqlconn = ConfigurationManager.ConnectionStrings["sqlconn"].ConnectionString;
using (SqlConnection conn = new SqlConnection(s_sqlconn))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "Proc_OrdMa";
cmd.CommandType = CommandType.StoredProcedure;
foreach (SqlParameter Parameter in Parameters)
{
cmd.Parameters.Add(Parameter);
}
SqlParameter orderID = cmd.Parameters.Add("@OrderID", SqlDbType.Int, 4);
orderID.Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
return Convert.ToInt32(orderID.Value.ToString());
}
}
}
//处理单据明细数据插入
public int OrderDt(params SqlParameter[] Parameters)
{
string s_sqlconn = ConfigurationManager.ConnectionStrings["sqlconn"].ConnectionString;
using (SqlConnection conn = new SqlConnection(s_sqlconn))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Proc_OrdDt";
foreach (SqlParameter Parameter in Parameters)
{
cmd.Parameters.Add(Parameter);
}
return cmd.ExecuteNonQuery();
}
}
}
//下面是后台插入代码
//插入主表
int OrderID = dborder.OrderMa(new SqlParameter("ItemsFee",Convert.ToDouble(labTotalPrice.Text.ToString())), new SqlParameter("ItemsNum", Convert.ToInt32(labTotalNum.Text.ToString())), new SqlParameter("Name", strName));
//插入明细
foreach (GridViewRow gvr in gvShopCar.Rows)
{
int ItemID = int.Parse(gvr.Cells[1].Text);
int Num = int.Parse(gvr.Cells[3].Text);
float TotailPrice = float.Parse(gvr.Cells[5].Text);
dborder.OrderDt(new SqlParameter("ItemID", ItemID), new SqlParameter("Num", Num), new SqlParameter("OrderID", OrderID), new SqlParameter("TotailPrice", TotailPrice), new SqlParameter("Remark", "西门吹雪"));
}
主要是我需要在那个环节插入一些控制,保障插入数据时,数据的完整性。
9 个解决方案
#1
可以利用事物,如果任何一个环节出现意外,则全部回滚
#2
楼上正解
#4
求教呀
#5
可以直接在存储过程中使用事务,不过使用事务容易死锁,也很麻烦,
#6
如果在存储过程中使用事务,那两个存储过程一个执行成功,一个失败,成功的那个能回滚么?
#7
在存储过程中使用事务就可以了,这样可以保证数据的完整性和一致性。
#8
把要保存的数据在一个事物里执行
#9
在业务逻辑层提供接口调用这些插入数据的方法(带事务的方法),都处理完后提交事务可以了。
#1
可以利用事物,如果任何一个环节出现意外,则全部回滚
#2
楼上正解
#3
开启事务,发生错误后回滚
存储过程中是使用事务,参考 http://www.cnblogs.com/RascallySnake/archive/2010/05/17/1737298.html
存储过程中是使用事务,参考 http://www.cnblogs.com/RascallySnake/archive/2010/05/17/1737298.html
#4
求教呀
#5
可以直接在存储过程中使用事务,不过使用事务容易死锁,也很麻烦,
#6
如果在存储过程中使用事务,那两个存储过程一个执行成功,一个失败,成功的那个能回滚么?
#7
在存储过程中使用事务就可以了,这样可以保证数据的完整性和一致性。
#8
把要保存的数据在一个事物里执行
#9
在业务逻辑层提供接口调用这些插入数据的方法(带事务的方法),都处理完后提交事务可以了。