调用存储过程,向主表和明细表插入数据,如何保证数据的完整性的问题。

时间:2022-07-11 21:39:42
请教各位高手,小弟现在遇到一个问题。
系统需要往订单主表中插入信息返回一个自增的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


楼上正解

#3


开启事务,发生错误后回滚
存储过程中是使用事务,参考 http://www.cnblogs.com/RascallySnake/archive/2010/05/17/1737298.html

#4


求教呀

#5


可以直接在存储过程中使用事务,不过使用事务容易死锁,也很麻烦,

#6


如果在存储过程中使用事务,那两个存储过程一个执行成功,一个失败,成功的那个能回滚么?

#7


在存储过程中使用事务就可以了,这样可以保证数据的完整性和一致性。

#8


把要保存的数据在一个事物里执行

#9


在业务逻辑层提供接口调用这些插入数据的方法(带事务的方法),都处理完后提交事务可以了。

#1


可以利用事物,如果任何一个环节出现意外,则全部回滚

#2


楼上正解

#3


开启事务,发生错误后回滚
存储过程中是使用事务,参考 http://www.cnblogs.com/RascallySnake/archive/2010/05/17/1737298.html

#4


求教呀

#5


可以直接在存储过程中使用事务,不过使用事务容易死锁,也很麻烦,

#6


如果在存储过程中使用事务,那两个存储过程一个执行成功,一个失败,成功的那个能回滚么?

#7


在存储过程中使用事务就可以了,这样可以保证数据的完整性和一致性。

#8


把要保存的数据在一个事物里执行

#9


在业务逻辑层提供接口调用这些插入数据的方法(带事务的方法),都处理完后提交事务可以了。