以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- datatables.Save()的保存机制? (http://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 -- 哎,查了一天,原来是这种情况 |