以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  datatables.Save()的保存机制?  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=41758)

--  作者:jnletao
--  发布时间:2013/10/26 17:08:00
--  datatables.Save()的保存机制?
想在BeforeSaveDataRow事件里做个保存前重复性检测,DataRowAdded做了自动编号
以下是BeforeSaveDataRow里的代码
以下内容为程序代码:

1 Dim dr As DataRow = e.DataRow
2 If dr.RowState <> DataRowState.Added Then \'如果不是新增行
3 Return \'那么返回
4 Else
5
6 Dim CarID As String
7 Dim cmd As New SQLCommand
8 cmd.C
9 cmd.CommandText = "Select [进场编号] From {车辆基本信息} Where [进场编号] = \'" & e.DataRow("进场编号") & "\'"
10 CarID = cmd.ExecuteScalar()
11
12 If CarID IsNot Nothing Then
13
14 Dim bh As String = Format(e.DataRow("进场时间"),"yyyyMMdd") \'取得进场编号的8位前缀
15
16 Dim max As String
17 Dim idx As Integer
18 cmd.CommandText = "Select Max([进场编号]) From {车辆基本信息} Where DateDiff(d,进场时间,\'" & e.DataRow("进场时间") & "\') = 0"
19
20 max = cmd.ExecuteScalar() \'取得该天的最大进场编号
21
22 If max > "" Then \'如果存在最大进场编号
23 idx = CInt(max.Substring(9,3)) + 1 \'获得最大进场编号的后三位顺序号,并加1
24 Else
25 idx = 1 \'否则顺序号等于1
26 End If
27 e.DataRow("进场编号") = bh & "-" & Format(idx,"000")
28
29 End If
30
31 End If

逻辑思路是这样的。
1,每当新增行时,通过DataRowAdded里代码自动编号,(这个在单用户操作时不做出错。)
2,在保存时,通过BeforeSaveDataRow做最终效验,如果外部数据库里不存在同名编号,则默认按自动编号保存
3,如果外部数据库里存在同名编号,则提取外部数据库中真实最大编号,+ 1 后保存


结果发现以下情况,当只新增一行时,然后保存,可有效检测?
当新增多行时,保存,行9总是无法返回上一条保存时数据?
难道datatables.Save默认不是逐条保存新增记录?还是我的代码判断有问题?

求高手给看下。

因为MSSQL外部数据源,没上源码,如果需要,一会就上

第8行代码论坛显示不全,cmd.ConnectionName = “htdata”

[此贴子已经被作者于2013-10-26 17:12:42编辑过]

--  作者:Bin
--  发布时间:2013/10/26 17:12:00
--  
保存应该是一次性全部保存的,虽然会逐行触发BeforeSaveDataRow,但是最终应该是一段SQL语句一次性执行保存的.
--  作者:jnletao
--  发布时间:2013/10/26 17:24:00
--  
哎,查了一天,原来是这种情况