Foxtable(狐表)用户栏目专家坐堂 → 异步函数AsyncExecute可否应用后台数据的处理SQLFind、SQLAddNew等


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

主题:异步函数AsyncExecute可否应用后台数据的处理SQLFind、SQLAddNew等

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


加好友 发短信
等级:一尾狐 帖子:424 积分:5121 威望:0 精华:0 注册:2012/11/16 8:21:00
异步函数AsyncExecute可否应用后台数据的处理SQLFind、SQLAddNew等  发帖心情 Post By:2024/8/31 14:41:00 [只看该作者]

1,我在Initialize中生一个全局变量DataTable表“_dt河北省网报日志”,代码如下:

Dim cmd As New SQ LCommand

cmd.C

cmd.CommandText = "SEL ECT * From {河北省_网报日志} where [_Identify] <0"

_dt河北省网报日志 = cmd.ExecuteReader(True)


2,我还有普通的DataTable表“abc”


请问对于这两种DataTable表,我可以在异步函数AsyncExecute中使用SQLUpdate、SQLAddNew等后台处理命令对这两种情况的表进行查询,更新,新增等操作吗?



[此贴子已经被作者于2024/8/31 14:41:29编辑过]

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


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

首先,这种代码不应该放到Initialize,而是放到AfterOpenProject事件

其次,上面两种表格,以及SQLUpdate、SQLAddNew等都无法在异步函数里使用。

建议把1楼的代码放到异步函数里,然后使用临时变量,不要使用全局变量。异步函数里建议都使用SQLCommand处理
[此贴子已经被作者于2024/8/31 15:23:34编辑过]

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


加好友 发短信
等级:一尾狐 帖子:424 积分:5121 威望:0 精华:0 注册:2012/11/16 8:21:00
  发帖心情 Post By:2024/8/31 19:15:00 [只看该作者]

老师,我按您的思路写了一个“专业_打印增删异步”的函数,内容如下:
Dim zyid As String = Args(0) '专业id
Dim ksid As String = Args(1) '考生联系电话
Dim ksxm As String = Args(2) '考生姓名
Dim teacher As String = Args(3) '指导老师
Dim cmd As New SQLCommand
cmd.C
cmd.CommandText = "Sele ct Count(*) From {专业_自选} Where 考生id='" & ksid & "' and id='" & zyid & "'"
Dim count As Integer = cmd.ExecuteScalar
If count = 0 Then
    cmd.CommandText = "Se lect 科类,批次,学校代号,学校名称,专业代号,专业名称,专业简注 from {河北省_志愿填报} Where id='" & zyid & "'"
    Dim Values = cmd.ExecuteValues
    cmd.CommandText = "Inser t Into 专业_自选 (科类,批次,学校代号,学校名称,专业代号,专业名称,专业说明,id,考生id,考生姓名,填加时间,指导老师) Values(?,?,?,?,?,?,?,?,?,?,?,?)"
    cmd.Parameters.Add("@科类", Values("科类"))
    cmd.Parameters.Add("@批次", Values("批次"))
    cmd.Parameters.Add("@学校代号", Values("学校代号"))
    cmd.Parameters.Add("@学校名称", Values("学校名称"))
    cmd.Parameters.Add("@专业代号", Values("专业代号"))
    cmd.Parameters.Add("@专业名称", Values("专业名称"))
    cmd.Parameters.Add("@专业说明", Values("专业简注"))
    cmd.Parameters.Add("@id", zyid)
    cmd.Parameters.Add("@考生id", ksid)
    cmd.Parameters.Add("@考生姓名", ksxm)
    cmd.Parameters.Add("@填加时间", Date.Now)
    cmd.Parameters.Add("@指导老师", teacher)
    cmd.ExecuteNonQuery
    
Else
    cmd.CommandText = "DE LETE FROM {专业_自选} Where 考生id='" & ksid & "' and id='" & zyid & "'"
    cmd.ExecuteNonQuery()
End If

调用异步函数代码如下,此代码我放在了“DataColChanged”事件中:
     Functions.AsyncExecute("专业_打印增删异步", e.DataRow("id"), Vars("联系电话"), vars("姓名"), Vars("指导老师"))

当我对当前表1000行操作时,假如需要往“专业_自选”表中增加1000行数据,我在查询“专业_自选”表中记录的条数状态,发现会显示“100,150、203、486。。。。”也是慢慢增加的过程,并没有瞬间这1000行就增加到“专业_自选”表中,既然是单独的线程,应该和增加一条的时间是相同的呀,为啥感觉还和单线程差不多呢

[此贴子已经被作者于2024/8/31 19:27:56编辑过]

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


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

客户端是异步了。但是服务器也是要一条一条的接收数据的呀,数据库也是要一条一条的执行的呀!

如果当前表和上面“专业_自选”表等都是同一个数据库的,全部都使用sql处理即可,没有必要逐行处理

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


加好友 发短信
等级:一尾狐 帖子:424 积分:5121 威望:0 精华:0 注册:2012/11/16 8:21:00
  发帖心情 Post By:2024/9/1 20:52:00 [只看该作者]

“如果当前表和上面“专业_自选”表等都是同一个数据库的,全部都使用sql处理即可,没有必要逐行处理” 老师,这两个表是在一个数据库,全部使用sql处理,我不太懂,还请老师详细说一下,谢谢??

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


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

我不清楚表结构和数据是怎么样的,大概:比如当前表名称为表A

Insert Into 专业_自选 (科类,批次,学校代号,学校名称,专业代号,专业名称,专业说明,id,考生id,考生姓名,填加时间,指导老师) Select 科类,批次,学校代号,学校名称,专业代号,专业名称,专业简注,b.id,b.考生id,b.考生姓名,b.填加时间,b.指导老师 from {河北省_志愿填报} as a inner join 表A as b on a.考生id=b.考生id and a.id=b.id where not exists (select * FROM {专业_自选} as c  Where b.考生id=c.考生id and b.id=c.id)

DELETE FROM {专业_自选} as a inner join 表A as b  Where a.考生id=b.考生id and a.id=b.id



 回到顶部