xml - 使用 ado 对象使用 'save' 方法更改 xml 导出字段的精度

标签 xml vb6 ado

我正在开发一个 VB6 应用程序,该应用程序使用 ADODB.Recordset 对象通过“save”方法将数据转储到 .xml 文件,如下所示:

adoRecordset.Save strDst, adPersistXML

其中 strDst 是描述目的地的字符串。

现在,数据库中的某些表的某些行是 float / double 。例如,表 TABLE 包含 float 类型的列 MEASURE。

问题: 是否可以控制写入 .xml 文件的 MEASURE 精度?

例如,如果度量为 1.23456789 是否可以在输出文件中包含measure="1.234"?

想法: ADO 记录集对于数据库的每条记录都有一个“Field”类型的集合“Fields”。字段的属性“精度”存在,但“大部分”是只读的。看MSDN的帮助还不太清楚什么时候能写出来。它可以以某种方式使用吗?

限制: 我确实想使用“保存”方法。我想知道是否可以使用它以避免编写自己的方法。

背景: 目的是通过长距离 channel 将从数据库中提取的大量数据传输到另一个系统。在该系统中,数据被加载到数据库中以进行初步分析。瓶颈是 channel 和现有的数据提取应用程序,它通过某种算法选择要传输的表。 .xml 文件以高压缩率进行压缩,但数量仍然太多,因此我们决定删除一些不那么重要的数据。

附带问题(引用onedaywhen的解决方案) 感谢您迄今为止的答复。我使用它的方式略有不同,但它已经帮助了很多(+1)。 出现的问题是大多数值都在所需位置进行了很好的舍入,但是当将其写入 .xml 时,存在一种二进制到十进制转换错误。例如3.123 变为“3.1230000000000002”。

最佳答案

简单的解决方案是使用 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 中显示为已更新。

关于xml - 使用 ado 对象使用 'save' 方法更改 xml 导出字段的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/602839/

相关文章:

Python:获取属性

c# - 序列化类型对象的属性

c# - 将 vb6 类型转换为 VB.net 或 C# 结构

MySQL 和 ADO - 无望了吗?

java - 无法使用 JAXB 读取 XML 文件

xml - Xform 输入字段中允许的字符限制

vb6 - 在 Visual Basic 6 IDE 之外检测文件更改?

visual-studio - Vb6 拖放 HTML 数据

vb6 - 将列附加到 ADO 记录集

asp-classic - 设置 ADO 命令的 ActiveConnection = Nothing 是否会关闭底层 SQL 连接?