我有一个加载程序,用于自动加载使用脚本运行的数据(包含名为batchautoload.cmd
的脚本的加载程序)。
cd C:\file\loader\
C:\file\loader\load.exe /appID=1234 /username=admin /process="load" /initialDate=T1 /finalDate=T2
我有一个查询来确定由于故障或类似原因,使用上述过程没有加载任何数据。
declare @initdate as varchar(20)
declare @lastdate as varchar(20)
declare @location as varchar(20)
set @initdate = CONVERT(date,GETDATE()-1);
set @lastdate = CONVERT(date,GETDATE());
set @location = 'xxxx%'
;with q(a, c) as
(
select MIN(date), MAX(date)
from Table_Loader
where nameplace like @location
and date >= @initdate
and date <= @lastdate
union all
select DATEADD(hour,1,a), c
from q
where a < c
)
select *
from q
where a not in
(
select date
from Table_Loader
where nameplace like @location
and date >= @initdate
and date <= @lastdate
)
order by a asc
OPTION (MAXRECURSION 0)
"
现在,我的问题是,是否有可能以某种方式将查询结果转移到脚本“ / initialdate = queryresulttime / finaldate = queryresulttime + 1”的脚本?
我对使用VB控制台有一些一般的想法,其中:
步骤1
Module Module1
Dim sqCon As New SqlClient.SqlConnection("Server=10.10.111.11;Database=DataBaseMain1;Connection Timeout=50;Trusted_Connection=Yes;")
Dim sqCmd As New SqlClient.SqlCommand
Dim sdrRow As SqlClient.SqlDataReader
Sub Main()
sqCmd.Connection = sqCon
sqCmd.CommandText =
"
declare @initdate as varchar(20)
declare @lastdate as varchar(20)
declare @location as varchar(20)
set @initdate = CONVERT(date,GETDATE()-1);
set @lastdate = CONVERT(date,GETDATE());
set @location = 'xxxx%'
;with q(a, c) as
(
select MIN(date), MAX(date)
from Table_Loader
where nameplace like @location
and date >= @initdate
and date <= @lastdate
union all
select DATEADD(hour,1,a), c
from q
where a < c
)
select *
from q
where a not in
(
select date
from Table_Loader
where nameplace like @location
and date >= @initdate
and date <= @lastdate
)
order by a asc
OPTION (MAXRECURSION 0)
"
sqCon.Open()
sqCmd.ExecuteNonQuery()
sdrRow = sqCmd.ExecuteReader()
For Each itm In sdrRow
Dim column0 As String = sdrRow.GetValue(0)
MsgBox(column0)
Next
sdrRow.Close()
sqCon.Close()
End Sub
End Module
现在我可以生成进程#1,但不能生成#2和#3。由于数据将用在脚本中,因此我正在考虑创建批处理的临时文件(仅在运行此控制台时显示,在控制台完成过程后删除)。因为我不想从控制台创建许多文件。
我是VB控制台的新手,因此请限制我的想法以解决此问题。我听说过“烟斗”,但我不知道该怎么做。我仍在考虑继续进行For Each
循环或For
循环,但仍坚持下去。请给我提意见。只是为了通知,我打算将这个控制台实现为每天运行。
答案 0 :(得分:1)
您可以像这样调整导出/导入过程吗?
\\srvApplicationA\ExportForApplicationB
。Export20190530_132255.part
在写操作期间,Export20190530_132255.xml
(或需要任何最终扩展)在完成时。\\srvApplicationA\ExportForApplicationB
中所有具有最终扩展名的导出文件(通常不导出,但是如果服务关闭了一段时间,则可能有很多),并且每次尝试移动它到文件夹\\srvApplicationA\ExportForApplicationB\InProgress
的目录中,如果成功,则尝试导入它(否则该错误将被忽略,该导入应用程序可能已经启动了多次,因此出现了竞争情况。只需在循环中选择下一个文件)。 如果导入成功,则文件从\\srvApplicationA\ExportForApplicationB\InProgress
移至文件夹\\srvApplicationA\ExportForApplicationB\Success
,如果移至文件夹\\srvApplicationA\ExportForApplicationB\Error
,则移至文件夹ImportFromAtoB.exe
。
在VB.NET中,您创建了一个应用程序,例如ImportFromAtoBService.exe
,该应用程序可以执行上述所有逻辑,并且可以在静默模式下启动而无需用户交互。
在VB.NET中,您还制作了一个简单的自安装/卸载Windows服务,例如说\\srvApplicationA\ExportForApplicationB\Error
,不包含任何逻辑,但每5分钟调用一次ImportFromAtoB.exe(它必须作为Windows计划的服务任务不可靠)。
将服务作为自动启动安装在其中一台服务器或另一台始终运行的计算机上,并且从现在开始永久可靠地完成导入。
这种专用的服务/应用程序设置的优点是,您可以轻松地在Visual Studio中交互地调试导入逻辑,在开发期间,我还发现,令人耳目一新的是,只需将新的导入二进制文件复制到旧版本而不停止服务(这可以通过终端服务器会话保存交互式登录到服务器的信息,停止服务,卸载,复制文件,重新安装,启动服务并注销-有时甚至需要重启后,卸载和重新安装相同(修改后的)服务的次数过多。
现在唯一的手动任务是不时检查文件夹\\srvApplicationA\ExportForApplicationB\Success
并分析为什么无法导入某个文件(并删除/存档{{1 }}。