主题:  如何提交一个订单事务

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#12005/1/24 14:31:02
最近在做个旅游网的预订系统,预订信息分主信息和详细信息。主信息主要是人数、价格、班次及联系人信息。详细信息主要为每个游客的个人资料,如姓名、身份证、联系电话等。两张表是一对多的关系,即主表订单下有多个游客资料记录。

在预订时,因预订社很多,可能会引起冲突,所以想实现事务提交方法。ADO.NET是支持事务提交的,实现也比较方便。但由于数据库类的包装原因,对事务的支持做得并不好,所以想就数据类包装对事务支持作些讨论。

另外,如果这个事务用T-SQL来实现,并希望用存储过程,这个存储过程可以怎样来写。

订单问题应该是很普遍的,希望大家都能来讨论一下。


非常大鱼

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#22005/1/25 1:09:57
我先说说事务的方法

// 先打开数据库连接
if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
// 建立Command对象
SqlCommand myCommand = DbConnection.CreateCommand();

// 建立事务对象,开始事务
SqlTransaction mySqlTransaction = DbConnection.BeginTransaction();
// 把Command与事务联系起来
myCommand.Transaction = mySqlTransaction;

// 注:事务有保存回滚点的方法,即在需要的地方插入点
// mySqlTransaction.Save("SaveOrder");
// 回滚可用 mySqlTransaction.Rollback("SaveOrder");
// 如果 mySqlTransaction.Rollback(); 则回滚至事务的起始点

// 执行插入主订单记录
myCommand.CommandText = ...... // 不写具体方法了
// 设置Command对象的参数
......
myCommand.Parameters["@OrderID"].Direction = ParameterDirection.Output;
......
myCommand.ExecuteNonQuery();
// 可以得到新插入记录的ID号
int newID = (int)myCommand.Parameters["@OrderID"].value;

// 插入各订单明细
foreach (OrderDetailInfo detailInfo in info.Details)
{    
    myCommand.CommandText = ......

    try
    {
        myCommand.ExecuteNonQuery();
    }
    catch
    {
        // 插入失败,则回滚事务
        mySqlTransaction.Rollback();
        return 0;
    }
}

// 提交事务
mySqlTransaction.Commit();
return newID;


非常大鱼

缺缺

职务:管理员
等级:8
金币:41.0
发贴:9620
#32005/1/25 9:05:57
承教.以前还真的没有怎么接触过这个.



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#42005/1/25 10:59:42
allinhands客气了,我也是最近要做这个系统才去接触事务,看了书上一大堆的东西,发觉自己对SQL方面还很粗浅。


非常大鱼