VBConsole - перенести результат из запроса в пакетный скрипт и запустить пакетный файл - PullRequest
0 голосов
/ 28 мая 2019

У меня есть загрузчик для автоматической загрузки данных, который запускается с использованием скрипта (загрузчик, содержащий указанный скрипт был 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, но застрял на этом.Пожалуйста, посоветуй мне.Просто чтобы сообщить, я планирую внедрить эту консоль для ежедневного запуска.

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Можете ли вы адаптировать процесс экспорта / импорта следующим образом:

  • Приложение A экспортирует данные более или менее надежно каждый час и записывает их в папку, соответственно.общий доступ к файлам где-нибудь в вашей сети, скажем, \\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.

  • В VB.NET вы создаете приложение, скажем ImportFromAtoB.exe, которое выполняет всю логику, упомянутую выше, икоторый может быть запущен в автоматическом режиме без вмешательства пользователя.

  • В VB.NET вы также делаете простую самоустановочную / деинсталлирующую службу Windows, скажем, ImportFromAtoBService.exe, не содержащую логики, но вызывающуюImportFromAtoB.exe каждые 5 минут (это должна быть служба, поскольку запланированные задачи Windows не являются надежными).

  • Установите службу как автозапуск на одном из серверов или другой машине, которая всегдавыполняется, и с этого момента импорт надежно выполняется навсегда.

  • Преимущество этой специализированной настройки службы / приложения заключается в том, что вы можете легко отлаживать логику импорта интерактивно в Visual Studio, а такжеВ периоды разработки можно обнаружить, что можно просто скопировать новые двоичные файлы импорта поверх старых, не останавливая службу (что позволяет сохранить интерактивный вход на сервер через сеанс сервера терминалов, остановить службу, удалить ее, скопировать файлы)., переустановить его, запустить сервис и войтиВыключение - иногда требуется даже перезагрузка после слишком большого количества деинсталляций и переустановок одной и той же (измененной) службы.

  • Теперь единственной ручной задачей является проверка папки \\srvApplicationA\ExportForApplicationB\Error извремя от времени и анализировать, почему определенный файл не может быть импортирован (и время от времени удалять / архивировать старые файлы импорта в \\srvApplicationA\ExportForApplicationB\Success).

1 голос
/ 29 мая 2019

Я думаю, что лучшим решением для вас является написание небольшого приложения winforms, которое работает вечно, пока не будет закрыто, и которое содержит большой многострочный текстовый элемент управления для входа в систему и таймер, чтобы проверить, когда импорт должен быть выполнен и который вызывает загрузчик.Отлично, чтобы сделать это.(Это предполагает, что loader.exe является сторонним инструментом, а не написанным вами, в противном случае просто реализуйте код для импорта в том же приложении, а также при условии, что этот импорт не нужно запускать без присмотра, в противном случае служба Windows будетправильный выбор).

Событие таймера ожидает, пока процесс не завершится, и, если импорт не будет успешным, спит 30 секунд и пытается снова, записывая все на экран.

Или почему шаг № 2иногда терпеть неудачу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...