异常值java.sql.SQLException:参数索引超出范围(1>参数的数量,这是0)

问题描述:

我发现了这样的错误:异常值java.sql.SQLException:参数索引超出范围(1>参数的数量,这是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) 

当我试图执行此类:

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

很高兴提供帮助。在StackOverflow是自定义接受为解决您的问题贡献最多的答案。您可以通过点击答案投票附近的复选标记来做到这一点,所以它变成纯绿色。 – 2010-06-04 16:28:14

可怕的格式。当使用参数时,不要放'?',而只需要?

更改行:

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 (?,?,?,?,?,?)"); 

这就是为什么他认为你有0参数,但被指定第一。

另请注意,您正在执行INSERT,因此不得使用executeQuery。改为使用executeUpdate()

+1

谢谢你,但现在我有这个错误: Excepcion java.sql.SQLException:不能用executeQuery()发出数据操作语句。 java.sql.SQLException:不能使用executeQuery()发出数据操作语句。 \t在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) \t在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) \t在com.mysql.jdbc.SQLError.createSQLException (SQLError.java:926) \t在com.mysql.jdbc.StatementImpl.checkForDml(StatementImpl.java:412) \t在com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1794) – Rbn 2010-06-04 16:05:22

+2

使用'executeUpdate'而不是'executeQuery'。 – 2010-06-04 16:07:05

+0

你是否在'general_news'表中有一个名为'title'的列:)如果你希望粘贴'CREATE TABLE'语句。 – 2010-06-04 16:16:29