Здрастье. Надеюсь, праздники у вас уже закончились и были удачными?
Вопрос следующий: программа читает XML-файл и в переменную strPOLYA собирет названия полей (тэгов) (например strPOLYA = 'Pole1, Pole2, ..., PoleN'), а в переменную strVALUES собираются значения данных полей (тэгов). Когда пробегается полность одна запись создается переменная для добавления данных в таблицу:
strSQL = "INSERT INTO " & Tablica & " (" & strPOLYA & ") VALUES (" & strVALUES & ");"
Application.CurrentDb.Execute strSQL, dbFailOnError
Всё бы хорошо, но количество полей колеблется от 150 до 200, а про длину переменной strVALUES я просто боюсь предсказать длину (многие поля текстовые и длиной не менее 50, а есть еще и поля типа MEMO).
Каким образом можно добавить данные из XML-файла (каждую запись в отдельности) в таблицу?
(Двигаться по тэгам XML-файла я уже научился, использую childNodes, hasChildNodes и т.д.)
1. Для записи в базу данных используется функция DAO или ADO. 2. Вот пример из программы импорта данных xml http://www.leadersoft.ru/Rus/Market/db/Default.aspx?go=product&pid=400 Суть алгоритма. Создаем переменную типа xml_program и в нее загружаем данные некоторого узла. Далее все из переменной сохраняем в файл (Используется пример для сложного файла allsoft.xml с программами, ценами и версиями)
' Определяем типы переменных, куда будем считывать данные ' В обратном порядке для встроенных типов цена - версия - программа
' Цены программы Public Type xml_price id As Long name As String url As String range_name As String value As String End Type
' Версия программы Public Type xml_version id As Long url As String name As String fullname As String image As String description As String downurl As String os As String license_type As Long cdate As String screens() As String ' Картинки программы prices() As xml_price ' Цены End Type
' Базовая программа Public Type xml_program id As Long name As String image As String full_desc As String short_desc As String url As String vendor As String categories() As Long ' Категории программы versions() As xml_version ' Версии программы End Type
' Сохраняем данные в таблицах Текущей или удаленной базы Public Function SaveData(pr As xml_program, Optional FileMdb As String = "") As Variant On Error GoTo 999 Dim dbs As dao.Database, rst As dao.Recordset, r2 As dao.Recordset, prc As xml_price If FileMdb = "" Then ' Текущая база Set dbs = CurrentDb Else ' Открываем удаленную базу Set dbs = DBEngine.OpenDatabase(FileMdb, , True) End If ' 1. Сохраняем данные по программе allsoft.ru Set rst = dbs.OpenRecordset("SELECT * FROM AllsoftOffers WHERE OfferID=" & pr.id) With rst If .RecordCount = 0 Then .AddNew Else .Edit End If !OfferID = pr.id !name = pr.name !image = pr.image !url = pr.url !vendor = pr.vendor !full_desc = pr.full_desc !short_desc = pr.short_desc .Update End With rst.Close Set rst = Nothing ' 2. Сохраняем данные по категориям allsoft.ru Set rst = dbs.OpenRecordset("SELECT * FROM AllsoftCategories WHERE OfferID=" & pr.id) Dim cat As Variant With rst For Each cat In pr.categories rst.Filter = "id=" & cat If .RecordCount = 0 Then .AddNew Else .Edit End If !OfferID = pr.id !id = cat .Update Next End With rst.Close Set rst = Nothing ' 3. Сохраняем данные по версиям allsoft.ru Set rst = dbs.OpenRecordset("SELECT * FROM AllsoftVersions WHERE OfferID=" & pr.id) With rst Dim ver As xml_version, m As Long, n As Long For m = 0 To UBound(pr.versions) ver = pr.versions(m) rst.Filter = "id=" & ver.id If .RecordCount = 0 Then .AddNew Else .Edit End If !OfferID = pr.id !VersionID = ver.id !name = ver.name !description = ver.description !os = ver.os !downurl = ver.downurl !license_type = ver.license_type !fullname = ver.fullname !image = ver.image !cdate = ver.cdate .Update ' 3-1. Сохраняем данные по картинкам allsoft.ru Set r2 = dbs.OpenRecordset("SELECT * FROM AllsoftScreens WHERE versionid=" & ver.id) Dim scr As Variant For Each scr In ver.screens r2.Filter = "versionid=" & ver.id & " And Screen='" & scr & "'" If r2.RecordCount = 0 Then r2.AddNew Else r2.Edit End If r2!VersionID = ver.id r2!screen = scr r2.Update Next r2.Close Set r2 = Nothing ' 3-2. Сохраняем данные по ценам allsoft.ru Set r2 = dbs.OpenRecordset("SELECT * FROM AllsoftPrices WHERE versionid=" & ver.id) For n = 0 To UBound(ver.prices) prc = ver.prices(m) r2.Filter = "versionid=" & ver.id & " And priceid='" & prc.id & "'" If r2.RecordCount = 0 Then r2.AddNew Else r2.Edit End If r2!VersionID = ver.id r2!PriceID = prc.id r2!name = prc.name r2!range_name = prc.range_name r2!url = prc.url r2!value = prc.value r2.Update Next r2.Close Set r2 = Nothing Next End With rst.Close Set rst = Nothing ' Закрываем базу If FileMdb <> "" Then dbs.Close Set dbs = Nothing Exit Function 999: MsgBox Err.description, vbCritical, "Admin" Err.Clear End Function