Foxtable(狐表)用户栏目专家坐堂 → 问个新增行赋值效率的问题


  共有1938人关注过本帖树形打印复制链接

主题:问个新增行赋值效率的问题

帅哥哟,离线,有人找我吗?
晕了快扶我
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1207 积分:7224 威望:0 精华:0 注册:2013/3/4 18:02:00
问个新增行赋值效率的问题  发帖心情 Post By:2024/1/18 6:04:00 [只看该作者]


Dim crs As New List(Of DataRow)
For Each dr As DataRow In DataTables("包厢号表").DataRows
    Dim cr As DataRow = DataTables("前台订房表").Find("包厢号='" & dr("房号") & "'")
    If cr Is Nothing Then
        crs.Add(dr)
    End If 
Next
Dim st As Date = Date.Now
'要测试耗时的代码
Systemready = False
DataTables("前台订房表").StopRedraw
For Each dr As DataRow In crs
    Dim vr As DataRow = DataTables("前台订房表").AddNew
    vr("SysId") = Functions.Execute("数据表编号", "前台订房表")
    vr("营业日期") = yyrq
    vr("包厢号") = dr("房号")
    vr("状态") = "空房"
Next
DataTables("前台订房表").ResumeRedraw
DataTables("前台订房表").Save
Systemready = True
MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒")


蓝色代码增加45行数据,就要12秒多,有啥办法可以优化吗?

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110569 积分:562735 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/1/18 8:53:00 [只看该作者]

测试一下:

1、去掉保存的代码,看看要多长时间
2、直接给id取一个固定值(比如vr("SysId") = 1),测试要多长时间
3、有没有表达式列影响?http://www.foxtable.com/webhelp/topics/1935.htm

 回到顶部
帅哥哟,离线,有人找我吗?
晕了快扶我
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1207 积分:7224 威望:0 精华:0 注册:2013/3/4 18:02:00
  发帖心情 Post By:2024/1/18 14:34:00 [只看该作者]

蓝版,查了下,是

Functions.Execute("数据表编号", "前台订房表") 

这个函数的问题,函数代码在下面,这个要怎么优化呢?


Dim bm As String = args(0)
Dim cmd As New SQLCommand
cmd.C
cmd.CommandText = "s elect * from {编码表}"
Dim dt As DataTable = cmd.ExecuteReader(True)
Dim dr As DataRow = dt.Find("表名 ='" & bm & "'")
If dr IsNot Nothing Then 
    If Date.Today > dr("日期") Then '如果今天的日子大于存在表格里的日期
        dr("日期") = Date.Today
        dr("序号") = 0
    Else
        dr("序号") = dr("序号") + 1 '如果和今天的日子一样,则序号+1
    End If 
    Dim s As String = dr("前缀名") + Format(Date.Today, "yyMMdd") + Format(dr("序号"), "0000")
    dr.Save 
    Return(s)
End If

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110569 积分:562735 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/1/18 14:45:00 [只看该作者]

方法1、另外建一个函数,一次性返回多个编号,大概

Dim bm As String = args(0)
Dim 行数 As integer = args(1)
Dim cmd As New SQLCommand
cmd.C
cmd.CommandText = "s elect * from {编码表}"
Dim dt As DataTable = cmd.ExecuteReader(True)
Dim dr As DataRow = dt.Find("表名 ='" & bm & "'")
If dr IsNot Nothing Then 
    If Date.Today > dr("日期") Then '如果今天的日子大于存在表格里的日期
        dr("日期") = Date.Today
        dr("序号") = 行数
    Else
        dr("序号") = dr("序号") + 行数 '如果和今天的日子一样,则序号+1
    End If 
    dr.Save 
    Return(dr("序号") + 1)
End If

-----------
……
DataTables("前台订房表").StopRedraw
dim 编号索引 as integer = Functions.Execute("数据表编号2", "前台订房表",crs.count)
For Each dr As DataRow In crs
    Dim vr As DataRow = DataTables("前台订房表").AddNew
    vr("SysId") = dr("前缀名") + Format(Date.Today, "yyMMdd") + Format(编号索引, "0000")
编号索引 = 编号索引 + 1
    vr("营业日期") = yyrq
……

方法1、2个表如果在同一个数据库,建议使用存储过程处理

 回到顶部
帅哥哟,离线,有人找我吗?
晕了快扶我
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1207 积分:7224 威望:0 精华:0 注册:2013/3/4 18:02:00
  发帖心情 Post By:2024/1/18 14:49:00 [只看该作者]

大概懂了,谢谢蓝版

 回到顶部