- 爱易网页
-
C#教程
- 调用存储过程,向主表和明细表插入数据,怎么保证数据的完整性的有关问题
日期: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", "西门吹雪"));
}
主要是我需要在那个环节插入一些控制,保障插入数据时,数据的完整性。