Alterar a precisão de campos para exportação xml com o ADO objeto com o método 'salvar'

StackOverflow https://stackoverflow.com/questions/602839

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu estou trabalhando em um aplicativo VB6 que usa um objeto ADODB.Recordset para dados de despejo para um arquivo .xml com o 'save' método, como o seguinte:

adoRecordset.Save strDst, adPersistXML

onde strDst é uma string descrevendo o destino.

Agora, existem algumas linhas no banco de dados que são carros alegóricos / duplos, para alguns mesa. Por exemplo, a TABELA tabela contém uma medida do tipo float coluna.

Pergunta: É possível controlar a presision de medida que é escrito para o arquivo .xml?

Por exemplo, se a medida é 1.23456789 é possível ter medida = "1.234" no arquivo de saída?

Idea: O conjunto de registros ADO tem uma coleção 'Campos' do tipo 'Campo' para cada registro do banco de dados. A propriedade 'Precision' para os campos existe, mas é 'principalmente' somente leitura. É muito claro quando ele pode ser escrito por olhar para a ajuda do MSDN. ele pode ser usado de alguma forma?

Restrição: Eu quero usar o método 'Save'. Eu quero saber se é possível com ele, a fim de evitar escrever meu próprio método.

Fundo: O objectivo é o de transferir uma grande quantidade de dados extraídos da base de dados através de um canal de longa distância para um outro sistema. Nesse sistema, os dados são carregados em um banco de dados para preliminar análise. Os gargalos são o canal e a aplicação existentes para a extracção de dados, que selecciona as tabelas ser transferências via algum algoritmo. Os arquivos .xml são compactados com uma taxa de compressão elevada, mas a quantidade ainda é muito por isso que decidimos Queda alguns dados não tão importantes.

problemas secundários (referindo-se a solução onedaywhen de) Graças onedaywhen para você responder até agora. Eu usá-lo slitly de forma diferente, mas já ajudou muito (+1). O problema que aparece é que a maioria dos valores são bem arredondadas na posição desejada, mas quando ele é gravado no .xml, há uma espécie de binário para erro de conversão de decimal. por exemplo. 3.123 torna-se "3,1230000000000002".

Foi útil?

Solução 2

O método 'Save' não é bastante flexível. Sua finalidade é salvar dados persistentemente, isso é tudo. Alterar o formato de valores ou influenciar a forma como os dados são armazenados não é possível (apenas o PersistFormat pode ser definido).

A solução que adotamos é a pós-pocess o arquivo XML resultante de arredondamento todos os valores de ponto flutuante que estou interrested. Essa maneira que eu tenho a necessidade flexibilidade I.

Outras dicas

A solução mais simples seria para arredondar o valor usando SQL e retornar isso como uma coluna adicional para o conjunto de registros. Então, vamos supor que você tem um algoritmo de arredondamento complexa que requer o código do lado do cliente.

Você pode usar o provedor MSDataShape para 'anexar' uma nova coluna para o conjunto de registos, por exemplo do tipo numérico (ou seja fixo decimal de precisão), depois a pé o conjunto de registos para preencher os valores antes de guardar:

  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

As linhas irá mostrar como atualizado no XML, é claro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top