日期:2014-05-18  浏览次数:21025 次

调用存储过程,向主表和明细表插入数据,如何保证数据的完整性的问题。
请教各位高手,小弟现在遇到一个问题。
系统需要往订单主表中插入信息返回一个自增的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", "西门吹雪"));
  }


主要是我需要在那个环节插入一些控制,保障插入数据时,数据的完整性。