2015-03-24 2 views
0

детали окружающей среды являются: -SQLXML не работает с Java

Appserver является: - Apache Tomcat 8 JRE 1.8 (последняя, ​​как на март 01,2015) База данных MS-SQL Server 2008

Ниже приведен фрагмент кода: - произошло

<%@ page import="java.util.*,java.io.*,org.xml.sax.* ,javax.xml.*, org.w3c.dom.*, javax.sql.*, javax.xml.transform.*, javax.xml.transform.sax.* "%> 

<% 
java.sql.Connection con; 
java.sql.Statement s; 
java.sql.ResultSet rs; 
java.sql.PreparedStatement pst; 
con=null;s=null;pst=null;rs=null; 
//String url= "jdbc:sqlserver://dB_IP/dBName"; 
String url= "jdbc:sqlserver://IPADDRESS;databaseName=dBName;integratedSecurity=false;user=userid;password=password;"; 
//String url= "jdbc:jtds:sqlserver://dB_IP/dBName"; 
String id= "user_id"; 
String pass = "password"; 
try{ 
//Class.forName("net.sourceforge.jtds.jdbc.Driver"); 
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
//con = java.sql.DriverManager.getConnection(url, id, pass); 
con = java.sql.DriverManager.getConnection(url); 
}catch(ClassNotFoundException cnfex){ 
cnfex.printStackTrace(); 
} 
String sql = null,root1=null,root2=null,content_type="text/xml"; 
if(request.getParameter("sql")!=null){sql=request.getParameter("sql");}else{sql="select * from test_table for xml raw, xmldata";} 
if(request.getParameter("root")!=null){root1=request.getParameter("root");root2="</"+root1+">";root1="<"+root1+">";}else{root1="<parse>";root2="</parse>";} 
if(request.getParameter("contenttype")!=null){content_type=request.getParameter("contenttype");}else{content_type="text/xml";} 
try{ 
    out.println("inside try"); 
    s = con.createStatement(); 
    //SQLXML xmlVal = con.createSQLXML(); 
    String query = "select top 100 * from table for xml raw, xmldata"; 
    rs = s.executeQuery(query); 
     while (rs.next()) { 
      out.println("<br/>inside while " + query); 
      java.sql.SQLXML sqlxml = rs.getSQLXML(1); 
      //InputStream binaryStream = sqlxml.getBinaryStream(); 
/* 
      java.sql.SQLXML rssFeedXML = rs.getSQLXML(1); 
      javax.xml.parsers.DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder(); 
      Document doc = builder.parse(rssFeedXML.getBinaryStream()); 
      //System.out.println("RSS identifier: " + rssName); 
      //out.println(JDBCTutorialUtilities.convertDocumentToString(doc)); 
      out.println((doc)); 
*/ 
/* 
//http://docs.oracle.com/javase/6/docs/api/java/sql/SQLXML.html 

      Transformer identity = TransformerFactory.newInstance().newTransformer(); 
      Source source = sqlxml.getSource(null); 
      Result result = new StreamResult(System.out); 
      identity.transform(source, result); 
*/ 
     } 
     out.flush();out = pageContext.pushBody(); 
     out.println("Hi "); 
} 
catch(Exception e){e.printStackTrace();out.println("<br/>Caught " + e);} 
finally{ 
if(rs!=null) rs.close(); 
if(s!=null) s.close(); 
if(con!=null) con.close(); 
} 

%> 

Ошибка компиляции: -

Caught com.microsoft.sqlserver.jdbc.SQLServerException: преобразование из ntext в SQLXML не поддерживается.

"и Требование к": - возвращает XML-документ из инструкции select. Приложение xml - это то, что требуется.

Если есть какие-либо предложения, а не такой подход, вы можете сообщить мне.

+0

Дикая догадка о проблемах с конверсией, вы видели это? http://stackoverflow.com/questions/8334902/unable-to-cast-text-to-xml-in-sql-server – Koshinae

ответ

0

Сегодня я столкнулся с такой же проблемой. Похоже, что метаданные неправильно заполнены директивой «FOR XML».

Для преодоления этого я использовал переменную и сохраняется XML в переменной первой, как:

DECLARE @tmpXML XML 
SET @tmpXML = (
SELECT * FROM (SELECT 1 as one) T FOR XML AUTO, ELEMENTS) 
SELECT @tmpXML as [I can even have a name] 

Тогда можно получить XML с помощью метода getSQLXML из JDBC.