以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  异步函数AsyncExecute可否应用后台数据的处理SQLFind、SQLAddNew等  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=193279)

--  作者:fntfgz
--  发布时间:2024/8/31 14:41:00
--  异步函数AsyncExecute可否应用后台数据的处理SQLFind、SQLAddNew等
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编辑过]

--  作者:有点蓝
--  发布时间:2024/8/31 15:23:00
--  
首先,这种代码不应该放到Initialize,而是放到AfterOpenProject事件

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

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

--  作者:fntfgz
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间:2024/9/1 19:53:00
--  
客户端是异步了。但是服务器也是要一条一条的接收数据的呀,数据库也是要一条一条的执行的呀!

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

--  作者:fntfgz
--  发布时间:2024/9/1 20:52:00
--  
“如果当前表和上面“专业_自选”表等都是同一个数据库的,全部都使用sql处理即可,没有必要逐行处理” 老师,这两个表是在一个数据库,全部使用sql处理,我不太懂,还请老师详细说一下,谢谢??
--  作者:有点蓝
--  发布时间: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