2010-06-04 17 views
5

sto ottenendo questo errore:Eccezione java.sql.SQLException: Indice Parametro fuori intervallo (1> numero di parametri, che è 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) 

quando sto cercando di eseguire questa classe:

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

Felice di aiutare. A StackOverflow è consuetudine accettare la risposta che ha maggiormente contribuito a risolvere il tuo problema. Lo fai facendo clic sul segno di spunta vicino alla votazione della risposta, quindi diventa verde fisso. –

risposta

12

formattazione orribile. Quando si utilizzano i parametri non si inserisce '?' ma semplicemente ?.

cambiare la linea:

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

a

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

Questo è il motivo per cui lui pensa di avere 0 parametri, ma sono stati specificando il primo.

Si noti inoltre che si sta eseguendo un INSERT e come tale NON DEVE utilizzare executeQuery. Utilizzare invece executeUpdate().

+1

Grazie amico, ma ora ho questo errore: Excepcion java.sql.SQLException: Impossibile emettere istruzioni di manipolazione dei dati con executeQuery(). java.sql.SQLException: Impossibile emettere istruzioni di manipolazione dei dati con executeQuery(). \t a com.mysql.jdbc.SQLError.createSQLException (SQLError.java:1055) \t a com.mysql.jdbc.SQLError.createSQLException (SQLError.java:956) \t a com.mysql.jdbc.SQLError.createSQLException (SQLError.java:926) \t a com.mysql.jdbc.StatementImpl.checkForDml (StatementImpl.java:412) \t a com.mysql.jdbc.PreparedStatement.executeQuery (PreparedStatement.java:1794) – Rbn

+2

Usa 'executeUpdate' e non 'executeQuery'. –

+0

E avete una colonna chiamata 'title' nella tabella' general_news' :) Se volete incollare l'istruzione 'CREATE TABLE'. –

Problemi correlati