VBScript с использованием двух For Next в одном коде - PullRequest
0 голосов
/ 11 января 2019

Мне нужно вставить шесть текстовых файлов в таблицы MySQL. Я хочу вставить файл txt10.txt в таблицу D1, файл txt20.txt в таблицу D2, файл txt30.txt в таблицу D3 и т. Д. Но все текстовые файлы вставляются во все таблицы MySQL.

Мой код ниже:

Arr1 = Array("txt10", "txt20", "txt30", "txt40", "txt50", "txt60") 
Arr2 = Array("D1", "D2", "D3", "D4", "D5", "D6")    

For K = 0 To UBound(Arr1)
    For I = 0 To UBound(Arr2)    
        SQL = " FLUSH TABLE `tbl_" & Arr2(I) & "_" & Year(Date()) & "`; "
        cn.Execute(SQL)   

        SQL = " LOAD DATA LOCAL INFILE 'D:\\nOpen\\" & Arr1(K) & ".txt' "
        SQL = SQL & " INTO TABLE `tbl_" & Arr2(I) & "_" & Year(Date()) & "` FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
        cn.Execute(SQL) 
    Next
Next

РЕДАКТИРОВАТЬ # 1

В вашем коде у меня ошибка:

Индекс массива вне диапазона

На этой строке:

tbl = Arr2(n)

Новый код:

Arr1 = Array("txt10", "txt20", "txt30", "txt40", "txt50", "txt60") 
Arr2 = Array("D1", "D2", "D3", "D4", "D5", "D6")    

For n=0 To UBound(Arr1)
    txt = Arr1(n)
    tbl = Arr2(n)  

    SQL = " FLUSH TABLE `tbl_" & tbl & "_" & Year(Date()) & "`; "
    cn.Execute(SQL)   

    SQL = " LOAD DATA LOCAL INFILE 'D:\\nOpen\\" & txt & ".txt' "
    SQL = SQL & " INTO TABLE `tbl_" & tbl & "_" & Year(Date()) & "` FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
    cn.Execute(SQL) 
Next 

1 Ответ

0 голосов
/ 11 января 2019

Ну да. Выполнение двух циклов For, как вы делаете, даст вам все возможные комбинации элементов ваших двух входных массивов.

То, что вы на самом деле хотите, это использовать один цикл и выбрать соответствующие элементы каждого массива:

For n=0 To UBound(Arr1)
    txt = Arr1(n)
    tbl = Arr2(n)
    'now insert txt into tbl
Next

В качестве альтернативы вы можете построить отображение файлов в таблицы (или наоборот), чтобы вам не приходилось полагаться на оба массива одинакового размера:

Set map = CreateObject("Scripting.Dictionary")
map.Add "txt10", "D1"
map.Add "txt20", "D2"
...

For Each txt In map.Keys
    tbl = map(txt)
    'now insert txt into tbl
Next

Независимо от того, какой путь вы выберете, НЕ создавайте SQL-запросы путем конкатенации строк. Это откроет ваш код для SQL-инъекции . Вместо этого используйте подготовленные операторы .

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