【问题标题】:How to keep a database updated from a xml file如何从 xml 文件中更新数据库
【发布时间】:2014-06-04 09:41:17
【问题描述】:

我正在尝试创建一个从 xml 文件更新数据库的函数。我在数据库中的列 - 表:“优惠”:id(A_I,PK)、城市、国家、酒店、描述、价格、图片

我认为只有在城市、国家和酒店相同的情况下,我才会更新报价。否则我将插入一个新行。我首先实现了对工作正常的 xml 文件的读取。 db连接没问题,我测试过了。

我有 2 个问题:首先,如果我能把它变小。第二个为什么不起作用并说:

Parameter index out of range (1 > number of parameters, which is 0).

我认为这是 sql 语句的问题,但我不知道如何解决它。 到目前为止我的代码:

package bookings1;
import java.io.File;
import java.sql.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; 

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

public class addOffers implements Runnable {

    public void run(){
        Connection connection = null;
        connection = ConnectionConfiguration.getConnection();
        try {
             // Start getting offers from xml
            File fXmlFile = new File("c:\\offers.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);        
            doc.getDocumentElement().normalize();        
            System.out.println("Root element :" + doc.getDocumentElement().getNodeName());       
            NodeList nList = doc.getElementsByTagName("offers");         
            System.out.println("----------------------------");      
            for (int temp = 0; temp < nList.getLength(); temp++) {       
                Node nNode = nList.item(temp);       
                System.out.println("\nCurrent Element :" + nNode.getNodeName());         
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {      
                    Element eElement = (Element) nNode;      
                    String DCity = eElement.getElementsByTagName("city").item(0).getTextContent();
                    String DCountry = eElement.getElementsByTagName("country").item(0).getTextContent();
                    String DHotel = eElement.getElementsByTagName("hotel").item(0).getTextContent();
                    String DDescription= eElement.getElementsByTagName("description").item(0).getTextContent();
                    String DPrice = eElement.getElementsByTagName("price").item(0).getTextContent();
                    String DImage = eElement.getElementsByTagName("image").item(0).getTextContent();                    
                    PreparedStatement st = connection.prepareStatement("SELECT * FROM offers WHERE city=? AND country=? AND hotel=?");
                    st.setString(1, DCity);
                    st.setString(2, DCountry); 
                    st.setString(3, DHotel);  
                    ResultSet rs = st.executeQuery();

                    if(rs.next()) { 
                     int theid = rs.getInt("id");   
                     PreparedStatement preparedStatement = 
                                connection.prepareStatement("UPDATE offers SET description=?, price=?, image=? WHERE id=?");
                                preparedStatement.setString(1, DDescription);
                                preparedStatement.setString(2, DPrice); 
                                preparedStatement.setString(3, DImage);  
                                preparedStatement.setInt(4, theid);  
                                preparedStatement.executeUpdate();
                    }
                    else {
                        PreparedStatement preparedStatement = 
                        connection.prepareStatement("INSERT into orders (city, country, hotel, description, image, phone) VALUES (?,?,?,?,?,?)");                       
                            preparedStatement.setString(1, DCity);
                            preparedStatement.setString(2, DCountry); 
                            preparedStatement.setString(3, DHotel);  
                            preparedStatement.setString(4, DDescription);  
                            preparedStatement.setString(5, DPrice);
                            preparedStatement.setString(6, DImage);
                            preparedStatement.executeUpdate();
                    }

                    connection.close();

                }
            }
            } catch (Exception e) {
              System.out.println("Fetching from xml thread interrupted! " + e.getMessage());
          }


    }   
}

【问题讨论】:

    标签: java mysql sql dom jdbc


    【解决方案1】:

    首先,JDBC 附带了很多样板代码。它永远不会短!尝试查看 JPA 和 Hibernate 的数据库功能?

    其次,您的错误消息告诉您,您正在尝试插入未定义的参数。

    PreparedStatement st = connection.prepareStatement("SELECT * FROM offers WHERE city='Beijing'");
    st.setString(1, DCity);
    st.setString(2, DCountry); 
    st.setString(3, DHotel);     
    

    基本上,如果你想将三个参数插入到你准备好的语句中,它应该看起来像这样:

    PreparedStatement st = connection.prepareStatement("SELECT * FROM offers WHERE city=? AND country=? AND hotel=?");
    st.setString(1, DCity);
    st.setString(2, DCountry); 
    st.setString(3, DHotel);      
    

    希望这能让你更清楚!

    【讨论】:

    • 我也试过这个,请查看编辑后的问题。没用。
    • 能看到完整的堆栈跟踪吗?
    • 嗨,亚历克斯,在你的回答中,我不相信你已经解决了你原来的问题。虽然代码现在可以工作,但您记录的两个解决方案是等效的,并且都应该提供相同的结果。 PreparedStatement 不起作用的事实表明您的代码中存在另一个您未能理解的潜在问题。另外,我不明白这是什么意思,“问题是在我的执行查询中我没有参数来将数据保存在 rs 变量中”,对我来说看起来很好,请你澄清一下。 (我对你自己的答案发表评论,但我还没有代表)
    【解决方案2】:

    这是我用过的。 :

    String sql = "SELECT * FROM offers where city='"+DCity + "' AND country='"+DCountry+"' AND hotel='"+DHotel+"'"; 
     Statement stmp = connection.createStatement(); 
    ResultSet rs = stmp.executeQuery(sql); 
    

    而不是

    PreparedStatement st = connection.prepareStatement("SELECT * FROM offers WHERE city=? AND country=? AND hotel=?");
    st.setString(1, DCity); 
    st.setString(2, DCountry); 
    st.setString(3, DHotel);  
    ResultSet rs = st.executeQuery();
    

    现在它可以工作了。问题是在我的执行查询中我没有参数来保存 rs 变量中的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多