VBConsole-将结果从查询传输到批处理脚本并运行批处理文件

时间:2019-05-28 12:31:56

标签: sql-server vb.net batch-file

我有一个加载程序,用于自动加载使用脚本运行的数据(包含名为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. 我的控制台将运行来自数据库的查询
  2. 将结果查询传输到脚本(卡在此处)
  3. 将自动运行从步骤2创建的脚本。

步骤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循环,但仍坚持下去。请给我提意见。只是为了通知,我打算将这个控制台实现为每天运行。

1 个答案:

答案 0 :(得分:1)

您可以像这样调整导出/导入过程吗?

  • 应用程序A每小时或多或少可靠地导出数据,并将其写入文件夹resp中。文件共享在网络上的某个地方,例如\\srvApplicationA\ExportForApplicationB
  • 最佳应用程序A将文件写入具有日期和时间的文件,并在完成后将其重命名为临时扩展名,例如Export20190530_132255.part在写操作期间,Export20190530_132255.xml(或需要任何最终扩展)在完成时。
  • 应用程序B每隔5分钟遍历\\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 }}。