一个桌面应用程序,分发了很多个客户端,每个客户端都可以向同一个数据库的订单表、订单明细表插入数据。订单号是主键,每个订单细分了多个订单明细。那么,每一个客户端在向数据库插入数据的时候,如何从数据库获取订单号,然后插入订单数据,和订单明细,同时又要保证多个客户端遇到同时插入的时候,不冲突,不插入相同的订单号。这个是怎么做的?
------解决思路----------------------
自增主键呗……
------解决思路----------------------
去搜索 购物车 的资料吧
------解决思路----------------------
子表你也可以自增主键啊……
------解决思路----------------------
你数据存储要有顺序的啊,第一步insert主表,然后通过identity返回自增主键,这时候就可以把他作为外键给子表了啊
------解决思路----------------------
在插入数据表的时候再获取订单号,不要一开始就获取.用一个变量获取订单号..把主表和子表插入放在一个事务里面执行
------解决思路----------------------
订单号需要一个全局业务自动编码引擎来提供类似:No.20150322-O00237这样的编号
------解决思路----------------------
创建一个 查询订单号的方法,insert的时候 ,加1,获取值。至于insert的时候 怎么避免不冲突,你可以写一个proc,里边执行insert语句,使用事物来执行插入。
http://www.cnblogs.com/zhuifengnianshao/archive/2010/11/24/1886939.html
------解决思路----------------------
我的做法是订单号是不传进去存储过程的,譬如是这样
------解决思路----------------------
create PROCEDURE [dbo].[spqGetVwCustInfo]
(
@p1 AS nvarchar(20),
@p2 as nvarchar(3),
@p3 AS varchar(200) OUTPUT
)
将订单号在p3输出,sp里面写着订单的生成规则,这样绝不会冲突了,如果你在C#里面生成订单号的话,是绝对有可能冲突的。
另外用自增id也不是很好,因为订单你不能是12346这样的数字,而是LSAD0001CS8888这样的东西,当然ID是订单的一个重要依据
------解决思路----------------------
请教个问题,获取返回自增id为什么不用inserted触发器,我待过的公司都是用的是identity,有点不解。

------解决思路----------------------
SqlServer版本都是2005以上的。
------解决思路----------------------
其实在客户端要新增订单的时候,你可以先生成一个订单号,然后给客户端,客户端做的只是对该订单数据的修改操作。如果在此期间,没有保存(也就是没有生成该订单),那么你只需将这个订单在数据库中删除即可。这样应该能够保证订单的不冲突,但不能保证订单号的连续性。
------解决思路----------------------
触发器不好呗,而且触发器貌似只有MSSQL才有
一般我们也都是通过identity返回自增值得
------解决思路----------------------
6#正解,写个存储过程或者transaction.
------解决思路----------------------
最好做个事务这样避免冲突
------解决思路----------------------
订单明细的id无所谓,主要是里面的订单号的外键。你的程序中应该先通过一个唯一的方法(比如自增外键)获取一个id,然后在同一个进程中保存这个id,后续的订单明细都用这个id作为订单号插入。
------解决思路----------------------
用个事务,大致类似这样
var sql="insert into xxx ()...; SELECT SCOPE_IDENTITY()";
using(var cmd = new SqlCommand(sql, conn))
{
cmd.Connection.Open();
var trans = cmd.Connection.BeginTransaction();
var orderId = (int)cmd.ExecuteScalar();
cmd.CommandText = 插入明细;
cmd.SqlParameters.Clear();
添加参数列表
var affects = cmd.ExecuteNonQuery();
}
要是你放到存储过程里,调用就更方便了
------解决思路----------------------
上面说的是用的自增主键的情况,更方便的是你可以直接用GUID,先得到主订单ID
------解决思路----------------------
你数据存储要有顺序的啊,第一步insert主表,然后通过identity返回自增主键,这时候就可以把他作为外键给子表了啊
这是正解。这就是一个同时插入两个表的逻辑,先插入主表,得到刚刚插入主表生成的自增主键@@identity全局变量里边就是这个值。 然后把它作为外键插入到子表即可。子表的ID也是自增长的。