2010-06-04 42 views
5

Tôi nhận được lỗi này:Exception java.sql.SQLException: Thông số index ra khỏi phạm vi (1> số tham số, đó là 0)

Exception java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). 
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) 
at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3288) 
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3272) 
at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4108) 
at com.inmobia.RSSToNews.Consumer.print(Consumer.java:92) 
at com.inmobia.RSSToNews.Consumer.main(Consumer.java:122) 

Khi tôi đang cố gắng để thực hiện lớp này:

package com.in.RSSToNews; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.Iterator; 
import java.util.List; 
import java.net.URLConnection; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 

import com.sun.syndication.feed.synd.SyndEntry; 
import com.sun.syndication.feed.synd.SyndFeed; 
import com.sun.syndication.io.SyndFeedInput; 
import com.sun.syndication.io.XmlReader; 

/** 
* Consumer class from RSS/Atom feed type. 
* 
* @author Rbn 
*/ 

public class Consumer { 





SyndFeed feed; 

/** 
* Class constructor 
* 
* @param url: url path to consume 
*/ 
public Consumer(String url) { 
    super(); 
    try { 
     URL feedUrl = new URL(url); 

     SyndFeedInput input = new SyndFeedInput(); 
     feed = input.build(new XmlReader(feedUrl)); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
     System.out.println("ERROR: "+ex.getMessage()); 
    } 
} 

/** 
* print method 
* Scroll down the list of entries and displays the feed title, author and description 
*/ 
void print() { 

    //feeds list 
    List<SyndEntry> entradas = new ArrayList<SyndEntry>(); 
    entradas = feed.getEntries(); 
    try 
    { 


     //list iterator 
    Iterator<SyndEntry> it = entradas.iterator(); 
    Class.forName("org.gjt.mm.mysql.Driver"); 
    Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/newsamerica", "root", "123"); 

     if (!conexion.isClosed()) 
     { 
        while (it.hasNext()) 
         { 
          SyndEntry entrada = it.next(); 
          String title=(entrada.getTitle()); 
          String link=(entrada.getLink()); 
          String author=(entrada.getAuthor()); 
          String description=(""+entrada.getDescription()); 
          Date date=(entrada.getPublishedDate()); 
          String date2= date.toString(); 

          String content=(""+entrada.getContents()); 

          //description=description.replaceAll("SyndContentImpl.value=", ""); 
          //System.out.println(text2); 
          //System.out.println("Autor.......: " + entrada.getAuthor()); 
          // System.out.println("Noticia.......: " + entrada.getContents()); 
          // Statement st = conexion.createStatement(); 
          PreparedStatement pstmt = conexion.prepareStatement("INSERT INTO general_news(title,link,author,description,date,content) VALUES ('?','?','?','?','?','?')"); 
          pstmt.setString(1,title); 
          pstmt.setString(2,link); 
          pstmt.setString(3,author); 
          pstmt.setString(4,description); 
          pstmt.setString(5,date2); 
          pstmt.setString(6,content); 
          ResultSet rs = pstmt.executeQuery(); 
          rs.next(); 
         } 



     } 


     conexion.close(); 
} 

    catch (Exception e) 
    { 
     // Error en algun momento. 
     System.out.println("Excepcion "+e); 
     e.printStackTrace(); 
    } 
} 


public static void main(String[] args) { 

    Consumer feed = new Consumer (args[0]); 
    feed.print(); 
} 

}

+1

Rất vui được trợ giúp. Tại StackOverflow là tùy chỉnh để chấp nhận câu trả lời đã đóng góp nhiều nhất để giải quyết vấn đề của bạn. Bạn làm điều đó bằng cách nhấp vào dấu kiểm gần dấu bình chọn để nó chuyển sang màu xanh lục. –

Trả lời

12

Horrible định dạng. Khi sử dụng các thông số bạn không đặt '?' nhưng chỉ đơn giản là ?.

Thay đổi dòng:

PreparedStatement pstmt = conexion.prepareStatement("INSERT INTO general_news(id,title,link,author,description,date,content) VALUES ('?','?','?','?','?','?')"); 

để

PreparedStatement pstmt = conexion.prepareStatement("INSERT INTO general_news(id,title,link,author,description,date,content) VALUES (?,?,?,?,?,?)"); 

Đây là lý do tại sao ông nghĩ rằng bạn có 0 thông số nhưng được xác định là người đầu tiên.

Cũng lưu ý rằng bạn đang thực hiện một số INSERT và như vậy PHẢI KHÔNG sử dụng executeQuery. Sử dụng executeUpdate() để thay thế.

+1

Cảm ơn người đàn ông, nhưng bây giờ tôi có lỗi này: Excepcion java.sql.SQLException: Không thể phát hành các câu lệnh thao tác dữ liệu bằng executeQuery(). java.sql.SQLException: Không thể phát hành các câu lệnh thao tác dữ liệu bằng executeQuery(). \t tại com.mysql.jdbc.SQLError.createSQLException (SQLError.java:1055) \t tại com.mysql.jdbc.SQLError.createSQLException (SQLError.java:956) \t tại com.mysql.jdbc.SQLError.createSQLException (SQLError.java:926) \t tại com.mysql.jdbc.StatementImpl.checkForDml (StatementImpl.java:412) \t tại com.mysql.jdbc.PreparedStatement.executeQuery (PreparedStatement.java:1794) – Rbn

+2

Sử dụng 'executeUpdate' và không phải 'executeQuery'. –

+0

Và bạn có một cột có tên là 'title' trong bảng' general_news' không :) Nếu bạn muốn dán câu lệnh 'CREATE TABLE'. –

Các vấn đề liên quan