【问题标题】:Equivalent of "For XML" in MS Access SQLMS Access SQL 中“For XML”的等价物
【发布时间】:2019-01-21 09:33:48
【问题描述】:

我需要使用 JDBC 和 SQL 语句从我的 Java 应用程序中根据一些预定义的条件从 MS Access 数据库中选择记录到 XML 输出。

有没有办法做到这一点?

【问题讨论】:

  • 不,不是。您必须在应用层而不是数据库层中完成所有到 XML 的转换。
  • 好的,经过搜索,我发现有一个vba编码可以实现,有没有办法从java执行vba?知道我想根据某些条件从访问表中选择一些行。
  • 您可以为此使用 COM 和 Access.Application 对象。但我强烈建议您使用 Gord 的解决方案。效率可能相当,但如果您从 Java 应用程序触发导出,调试/自定义 Gord 的解决方案会容易得多,并且使用 VBA 将需要安装完整的 Access 应用程序(使其仅限 Windows),而如果您纯粹使用 Java,您可以只使用数据库引擎或只使用 UCanAccess。

标签: java sql xml ms-access jdbc


【解决方案1】:

Access SQL 没有等效于 T-SQL 的FOR XML 子句。但是,您可以将这样的类添加到您的项目中

package com.example.ucanaccessdemo;

import java.io.StringWriter;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class ResultSetToXml {
    // adapted from
    //   http://www.java2s.com/Code/Java/Database-SQL-JDBC/ConvertaResultSettoXML.htm

    public static String asXml(ResultSet rs) throws ParserConfigurationException, SQLException, TransformerException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.newDocument();
        Element results = doc.createElement("Results");
        doc.appendChild(results);

        ResultSetMetaData rsmd = rs.getMetaData();
        int colCount = rsmd.getColumnCount();

        while (rs.next()) {
            Element row = doc.createElement("Row");
            results.appendChild(row);
            for (int i = 1; i <= colCount; i++) {
                String columnName = rsmd.getColumnName(i);
                Object value = rs.getObject(i);
                if (value != null) {
                    Element node = doc.createElement(columnName);
                    node.appendChild(doc.createTextNode(value.toString()));
                    row.appendChild(node);
                }
            }
        }
        DOMSource domSource = new DOMSource(doc);
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        StringWriter sw = new StringWriter();
        StreamResult sr = new StreamResult(sw);
        transformer.transform(domSource, sr);

        return sw.toString();
    }
}

然后将您的 ResultSet 传递给 asXml 方法

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM Clients");
String xml = ResultSetToXml.asXml(rs);

对于这样的示例表...

ID  LastName      FirstName  DOB
--  ------------  ---------  -------------------
 1  Thompson      Gord       2017-04-01 07:06:27
 2  Loblaw        Bob        1966-09-12 16:03:00
 3  Παπαδόπουλος  Ώπα

...生成的xml 字符串将如下所示(格式化为便于阅读)

<Results>
    <Row>
        <ID>1</ID>
        <LastName>Thompson</LastName>
        <FirstName>Gord</FirstName>
        <DOB>2017-04-01 07:06:27.0</DOB>
    </Row>
    <Row>
        <ID>2</ID>
        <LastName>Loblaw</LastName>
        <FirstName>Bob</FirstName>
        <DOB>1966-09-12 16:03:00.0</DOB>
    </Row>
    <Row>
        <ID>3</ID>
        <LastName>Παπαδόπουλος</LastName>
        <FirstName>Ώπα</FirstName>
    </Row>
</Results>

【讨论】:

  • 感谢您的回答,但我正在寻找一种方法来实现这一点,而无需循环遍历结果集行,方法是使用访问提供的功能(右键单击:导出到 xml)在 java 代码中......
猜你喜欢
  • 2020-01-07
  • 2013-03-24
  • 1970-01-01
  • 2015-01-14
  • 2017-01-15
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多