关于提交订单的一些问题,大家是怎么处理的?

weizengxun 2011-09-09 01:40:11
关于提交订单的一些问题,大家是怎么处理的?
订单系统(个人分析如下)
1.填写订单信息
2.确认订单信息(显示订单信息,未插入数据库)
3.提交订单(将数据插入数据库)----------------------------生成订单
4.再次显示订单信息(显示未支付,立即支付)----------------订单状态:未支付
5.支付订单(跳转到个支付接口进行支付)
6.修改订单状态(若支付成功)------------------------------订单状态:已支付,等待卖家发货
7.等待卖家发货
8.等待买家收货 -----------------------------------------订单状态:已发货,等待买家收货
9.买家收货 ---------------------------------------------订单状态:已收货,等待买家确认
10.买家确定收货——交易完成 ----------------------------订单状态:买家确认收货,交易完成

疑问:
1.当买家填写订单信息后,怎么把填写好的订单信息提交到确认订单信息页面?
我的思路:A.将信息保存到session中,
B.通过post方式提交到确认订单信息页面,
C.把填写好的订单信息插入数据库的临时表。
那种方式比较好呢?
2.向数据库插入数据时,是如何插入的?
数据库表设计:订单表(Order),订单子项表(OrderItem)
我的思路:A.向Order表插入订单信息,返回订单的ID,
B.循环将OrderItem+上订单ID插入OrderItem表中。
问题:如若是这样处理,如何保证事务的一致性,即如何保证向订单子项表插入数据发生错误时,回滚刚刚提交的订单
这种情况怎么处理?
...全文
681 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
weizengxun 2011-09-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 tr0j4n 的回复:]
要我就干脆用存储过程
[/Quote]
订单子项的条数是不确定的,如何用存储过程呢?
就算是用存储过程,也得用两个存储过程
MoXiaoRab 2011-09-11
  • 打赏
  • 举报
回复
要我就干脆用存储过程
weizengxun 2011-09-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wszhongwen 的回复:]
1.不插入数据库的话,放在SESSION里是可以
2.害怕数据出错的问题,回滚可以解决的。再不行就 当用户输入好点提交,这是就把数据插入数据库,在跳转到1个类似确认表单的页面,从数据库里把这个用户的这的订单取出来显示,下方显示按钮“是否确认此订单”
做双重确认。 用户确认后,把数据库的这张订单状态改为true
[/Quote]
双重确认这个方法似乎整的成的
weizengxun 2011-09-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 pigddyou 的回复:]
1.session貌似有大小限制,但是应该足够存储你的信息了吧阿,有的人喜欢把重量压在客户端,有的人喜欢压在服务器端,我比较喜欢存客户端。
2.用事务管理关联操作比较好。
[/Quote]
Session是存在服务器端的

第一个问题还有没有好的办法呀
weizengxun 2011-09-10
  • 打赏
  • 举报
回复
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
public static void ExecuteSqlTran(Hashtable SQLStringList)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlTransaction trans = conn.BeginTransaction())
{
SqlCommand cmd = new SqlCommand();
try
{
//循环
foreach (DictionaryEntry myDE in SQLStringList)
{
string cmdText = myDE.Key.ToString();
SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
trans.Commit();
}
catch
{
trans.Rollback();
throw;
}
}
}
}

可以使用这个方法提交多条语句的事务
猪小娣 2011-09-10
  • 打赏
  • 举报
回复
1.session貌似有大小限制,但是应该足够存储你的信息了吧阿,有的人喜欢把重量压在客户端,有的人喜欢压在服务器端,我比较喜欢存客户端。
2.用事务管理关联操作比较好。
  • 打赏
  • 举报
回复
using (DbConnection conn = new SqlConnection(connectionString))
{
conn.Open();
DbTransaction trans = conn.BeginTransaction();
DbCommand cmd = conn.CreateCommand();
cmd.Transaction = trans;
使用cmd修改其CommandText和Parameters属性提交订单
foreach (你的订单明细)
{
使用cmd修改其CommandText和Parameters属性提交订单明细
}
trans.Commit();
}


另外很明显,写ADO.NET代码要尽量使用System.Data.Common命名空间的那些。
  • 打赏
  • 举报
回复
借用一下#8楼的代码,但是你完全可以写的简洁一些,可以写:
            using (DbConnection conn = new SqlConnection(connectionString))
{
conn.Open();
DbTransaction trans = conn.BeginTransaction();
DbCommand cmd = conn.CreateCommand();
cmd.Transaction = trans;
使用cmd修改其CommandText和Parameters
属性提交订单
foreach (你的订单明细)
{
使用cmd修改其CommandText和Parameters
属性提交订单明细
}
trans.Commit();
}
}

这就足够了。如果有异常抛出,在conn与数据库的当前会话结束时,数据库系统自然就回滚了事务。
  • 打赏
  • 举报
回复
asp.net的现状是,服务程序经常重启。而且整个web服务也是如此,非常多的人都能够在设计web程序时习惯于基于“无状态”的服务方式来考虑web程序的设计,即假设服务器随时重启了(可能需要几秒钟),或者web服务器随时被负载均衡了,应用程序的状态数据都不会丢失。对于asp.net应用程序来说,就是你一开始设计程序时就应该明白Session集合里边的数据时随时会丢失的,你的程序应该不受任何影响。

至于第二点,能不能在插入多条记录时保证数据库是有事务处理的,纯粹是数据库操作的基本知识,不谈了。除非你在实际工作中使用了一种根本不支持事务的“数据库”。
threenewbee 2011-09-10
  • 打赏
  • 举报
回复
最好用工作流。
SK_Aqi 2011-09-09
  • 打赏
  • 举报
回复
c & a
苦逼的程序员 2011-09-09
  • 打赏
  • 举报
回复
1.不插入数据库的话,放在SESSION里是可以
2.害怕数据出错的问题,回滚可以解决的。再不行就 当用户输入好点提交,这是就把数据插入数据库,在跳转到1个类似确认表单的页面,从数据库里把这个用户的这的订单取出来显示,下方显示按钮“是否确认此订单”
做双重确认。 用户确认后,把数据库的这张订单状态改为true
a157147899 2011-09-09
  • 打赏
  • 举报
回复
1.这个确认订单信息的页面意义大吗?能否直接在提交的时候就提示“是否确认订单信息”?
如果是必须的话,建议用 server.Transfer() 这样就能获取到上一个页面的表单信息,但是url地址是不改变的,比较适合你这个需求。
2.插入订单表和插入订单子项表的操作 放到一个存储过程里,然后设置一下事务回滚,这样插入出错时,会自动回滚之前的Insert操作。

--设置事务自动回滚
set xact_abort on

--设置事务开始
begin transaction
//ToDo
commit transaction
posefooler 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 weizengxun 的回复:]
关于提交订单的一些问题,大家是怎么处理的?
订单系统(个人分析如下)
1.填写订单信息
2.确认订单信息(显示订单信息,未插入数据库)
3.提交订单(将数据插入数据库)----------------------------生成订单
4.再次显示订单信息(显示未支付,立即支付)----------------订单状态:未支付
5.支付订单(跳转到个支付接口进行支付)
6.修改订单状态……
[/Quote]
没处理过,mark!
arecaiz 2011-09-09
  • 打赏
  • 举报
回复
2.向数据库插入数据时,是如何插入的?
数据库表设计:订单表(Order),订单子项商品表(OrderItem)

插入时事务处理一下就OK
weizengxun 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 a157147899 的回复:]
1.这个确认订单信息的页面意义大吗?能否直接在提交的时候就提示“是否确认订单信息”?
如果是必须的话,建议用 server.Transfer() 这样就能获取到上一个页面的表单信息,但是url地址是不改变的,比较适合你这个需求。
2.插入订单表和插入订单子项表的操作 放到一个存储过程里,然后设置一下事务回滚,这样插入出错时,会自动回滚之前的Insert操作。

--设置事务自动回滚……
[/Quote]
订单子项有好多条呢?
weizengxun 2011-09-09
  • 打赏
  • 举报
回复
订单子项有好多条呢

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧