Изменение точности полей для экспорта в xml с помощью ado object методом save - PullRequest
2 голосов
/ 02 марта 2009

Я работаю над приложением VB6, которое использует объект ADODB.Recordset для передачи данных в файл .xml с помощью метода 'save', например:

adoRecordset.Save strDst, adPersistXML

где strDst - строка, описывающая пункт назначения.

Теперь в базе данных есть несколько строк, которые являются числами с плавающей запятой / двойниками для некоторой таблицы. Например, таблица TABLE содержит столбец MEASURE типа float.

Вопрос: Можно ли контролировать расположение MEASURE, которое записывается в .xml-файл?

Например, если мера равна 1.23456789, возможно ли иметь меру = "1.234" в выходном файле?

Идея: Набор записей ADO имеет коллекцию «Поля» типа «Поле» для каждой записи базы данных. Свойство «Точность» для полей существует, но в основном «только для чтения». Довольно непонятно, когда это можно написать, посмотрев на помощь MSDN. Можно ли это как-то использовать?

Ограничение: Я хочу использовать метод «Сохранить». Я хочу знать, возможно ли это, чтобы избежать написания моего собственного метода.

Справка: Цель состоит в том, чтобы перенести огромное количество данных, извлеченных из базы данных, по длинному каналу в другую систему. В этой системе данные загружаются в базу данных для предварительного анализа. Узкими местами являются канал и существующее приложение для извлечения данных, которое выбирает таблицы для передачи по некоторому алгоритму. Файлы .xml архивируются с высокой степенью сжатия, но их объем все еще слишком велик, поэтому мы решили отбросить некоторых не столь важных данных.

Боковые проблемы (в связи с одним решением при *) Спасибо, что сегодня вы ответите. Я использую это немного по-другому, но это уже очень помогло (+1). Проблема, которая появляется, состоит в том, что большинство значений хорошо округлены в желаемой позиции, но когда это записано в .xml, есть своего рода ошибка преобразования двоичного числа в десятичное. например 3.123 становится «3.1230000000000002».

Ответы [ 2 ]

3 голосов
/ 03 марта 2009

Простым решением было бы округлить значение с использованием SQL и вернуть его в качестве дополнительного столбца для набора записей. Итак, давайте предположим, что у вас есть сложный алгоритм округления, который требует кода на стороне клиента.

Вы можете использовать поставщик MSDataShape, чтобы «добавить» новый столбец к вашему набору записей, например, с типом числовой (то есть с десятичной точностью с фиксированной точностью), а затем пройти набор записей, чтобы заполнить значения перед сохранением:

  Dim rs As ADODB.Recordset
  Set rs = CreateObject("ADODB.Recordset")
  With rs
    .ActiveConnection = _
    "Provider=MSDataShape;" & _
    "Data Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=C:\Tempo\New_Jet_DB.mdb"
    .Source = _
    "SHAPE {" & _
    " SELECT ExistingField" & _
    " FROM ExistingTable" & _
    " ORDER BY ExistingField" & _
    "} APPEND NEW adNumeric(5, 4) AS NewField"
    .LockType = 4  ' adLockBatchOptimistic

    .Open

    Dim i As Long
    For i = 0 To .RecordCount - 1
      .Fields("NewField").value = Round(.Fields("ExistingField").value, 4)
      .MoveNext
    Next

    rs.Save "C:\rs.xml", adPersistXML

  End With

Строки будут отображаться как обновленные в XML, конечно.

1 голос
/ 01 апреля 2009

Метод «Сохранить» не совсем гибкий. Его целью является постоянное сохранение данных, вот и все. Изменить формат значений или повлиять на способ хранения данных невозможно (можно установить только PersistFormat ).

Решение, которое я принял, состоит в том, чтобы пост-обработать полученный XML-файл, округляя все значения с плавающей запятой, в которых я заинтересован. Таким образом, у меня есть нужная гибкость.

...