Мне нужно обновить набор записей в Excel VBA. Я извлекаю данные из CSV и использую текстовый драйвер для подключения к файлу. Вот моя связь с файлом, набором записей и кодом обновления.

Dim con As New ADODB.Connection
Dim rs As New ADODB.Recordset
con.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=C:\Users\jasons\Documents\sl;Extensions=csv;"

rs.Open "SELECT *, 0 As item FROM Pct.csv where [Sku No] in ('123455','123456')", con, adOpenDynamic, adLockOptimistic


rs.MoveFirst
Do Until rs.EOF
rs.Fields(0) = 2
rs.MoveNext
Loop

Но я продолжаю получать следующее сообщение об ошибке в строке rs.MoveNext.

-2147467259- [Microsoft] [ODBC Text Driver] Синтаксическая ошибка (отсутствует оператор) в выражении запроса '(item = Pa_RaM001 AND Style Code = Pa_RaM002 AND Sku No = Pa_RaM003'.

Когда я удаляю цикл и обновляю первую запись как

rs.MoveFirst
rs.Fields(0) = 2

Тогда это работает. Я поискал в Интернете примеры, но не вижу, что делаю неправильно. Буду признателен за любую помощь.

3
Jason Samuels 28 Май 2015 в 10:55
Действительно ли это цель - обновить записи в плоском CSV-файле с помощью ADODB? Если да, то ПОЖАЛУЙСТА, не делайте этого. Ваша конкретная проблема кажется ошибкой в ​​Text-DB-Provider. При обновлении временной таблицы имена полей не заключаются в квадратные скобки []. Таким образом, имена полей, такие как «Код стиля» и «Номер артикула», не сработают. Это можно было бы назвать ошибкой. Но почему Text-DB-Provider должен что-то обновлять? И как он будет обрабатывать курсоры и блокировку при использовании параллелизма?
 – 
Axel Richter
28 Май 2015 в 14:55

1 ответ

Лучший ответ

Вы можете использовать следующий подход для создания файлов CSV с помощью ADODB. ОБНОВЛЕНИЕ CSV-файлов - определенно плохая идея. ALTER TABLE, на мой взгляд, тоже невозможно. Таким образом, подход СОЗДАЕТ новую временную таблицу с новым полем. Затем копируем данные из старой таблицы и устанавливаем данные нового поля. И, наконец, замена временной таблицы в файл CSV.

Sub ADODB_CSV()

 Dim con As New ADODB.Connection

 con.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=C:\Users\jasons\Documents\sl;Extensions=csv;"

 On Error Resume Next
 con.Execute "DROP TABLE temp.csv"
 On Error GoTo 0

 con.Execute "CREATE TABLE temp.csv (item integer, [Style Code] text, [Sku No] text)"

 con.Execute "INSERT INTO temp.csv (item, [Style Code], [Sku No]) SELECT 0, [Style Code], [Sku No] FROM Pct.csv WHERE [Sku No] NOT IN ('123455','123456')"
 con.Execute "INSERT INTO temp.csv (item, [Style Code], [Sku No]) SELECT 2, [Style Code], [Sku No] FROM Pct.csv WHERE [Sku No] IN ('123455','123456')"

 con.Execute "DROP TABLE Pct.csv"
 con.Execute "CREATE TABLE Pct.csv (item integer, [Style Code] text, [Sku No] text)"

 con.Execute "INSERT INTO Pct.csv SELECT * FROM temp.csv"

 con.Execute "DROP TABLE temp.csv"

 con.Close

End Sub
3
Axel Richter 28 Май 2015 в 16:26
Я действительно не хочу обновлять исходный файл CSV, но создание временного файла выполняет свою работу
 – 
Jason Samuels
1 Июн 2015 в 11:38