Exception java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0) [duplicate]
Asked Answered
S

1

5

I'm getting this error:

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)

When I'm trying to execute this class:

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();
}
}
Sabra answered 4/6, 2010 at 15:59 Comment(1)
Glad to help. At StackOverflow is custom to accept the answer that has contributed the most to solve your problem. You do that by clicking the check mark near the answer votes so it turns solid green.Slump
S
12

Horrible formatting. When using parameters you do not put '?' but simply ?.

Change the line:

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

to

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

This is why he thinks you have 0 parameters but were specifying the first.

Also note that you are executing an INSERT and as such MUST NOT use executeQuery. Use executeUpdate() instead.

Slump answered 4/6, 2010 at 16:2 Comment(4)
Thanks man, but now i have this error: Excepcion java.sql.SQLException: Can not issue data manipulation statements with executeQuery(). java.sql.SQLException: Can not issue data manipulation statements with executeQuery(). 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.StatementImpl.checkForDml(StatementImpl.java:412) at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1794)Sabra
Use executeUpdate and not executeQuery.Slump
And do you have a column named title in general_news table :) If you wish paste the CREATE TABLE statement.Slump
Thanks smink, I searched for about 3 hours with MyBatis trying to find my error... here in a 5 year old post you had an answer :) '?' for my string when I just needed ? SMH..Norty

© 2022 - 2024 — McMap. All rights reserved.