简体   繁体   English

java.sql.SQLException:没有为参数5指定值,但字符串长度为4,而不是5

[英]java.sql.SQLException: No value specified for parameter 5, but the string length is 4, not 5

i plan to use yahoo finance csv api to generate url to get stock realtime price and time. 我计划使用雅虎财务csv api生成网址,以获得股票实时价格和时间。 The url is like this http://download.finance.yahoo.com/d/quotes.csvs=%40%5YHOO,GOOG,MSFT,BAC&f=nsl1o&e=.csv , and it returns a table with 4 columns. 该网址如下http://download.finance.yahoo.com/d/quotes.csvs=%40%5YHOO,GOOG,MSFT,BAC&f=nsl1o&e=.csv ,它返回一个包含4列的表格。

I use jdbc to store the data to Mysql, but there is always an error:"No value specified for parameter 5". 我使用jdbc将数据存储到Mysql,但始终存在错误:“没有为参数5指定值”。 The code is as below: public class Quote_Saver { private void connection(){ try { Class.forName("com.mysql.jdbc.Driver"); 代码如下:public class Quote_Saver {private void connection(){try {Class.forName(“com.mysql.jdbc.Driver”); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch(ClassNotFoundException e){e.printStackTrace(); } } }}

private String retrieveQuote() {
    StringBuffer buf = new StringBuffer();
    try {
        URL page = new URL("http://download.finance.yahoo.com/d/quotes.csv?s=%40%5YHOO,GOOG,MSFT,BAC&f=nsl1o&e=.csv");
        String line;
        URLConnection conn = page.openConnection();
        conn.connect();
        InputStreamReader in = new InputStreamReader(conn.getInputStream());
        BufferedReader data = new BufferedReader(in);
        while ((line = data.readLine()) != null) {
            buf.append(line + "\n");
        }
    } catch (MalformedURLException mue) {
        System.out.println("Bad URL: " + mue.getMessage());
    } catch (IOException ioe) {
        System.out.println("IO Error:" + ioe.getMessage());
    }
    return buf.toString();
}

//use the retrieveQuote class , pass it to data in ConnectionToMysql
private void ConnectionToMysql(String data){
    StringTokenizer tokens = new StringTokenizer(data, ",");
    String[] fields = new String[4];
    for (int i = 0; i < fields.length; i++) {
        fields[i] = stripQuotes(tokens.nextToken());
    }

    connection();
    String host ="jdbc:mysql://localhost/yahoo";
    String username = "root";
    String password = ".....";
    try {
        Connection connection = DriverManager.getConnection(host, username, password);
        String query = "insert into `stocks`(?,?,?,?) values (?,?,?,?);";
        PreparedStatement statement = (PreparedStatement) connection.prepareStatement(query);
        statement.setString(1, fields[0]);
        statement.setString(2, fields[1]);
        statement.setString(3, fields[2]);
        statement.setString(4, fields[3]);
        statement.executeUpdate();
        connection.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

private String stripQuotes(String input) {
    StringBuffer output = new StringBuffer();
    for (int i = 0; i < input.length(); i++) {
        if (input.charAt(i) != '\"') {
            output.append(input.charAt(i));
        }
    }
    return output.toString();
}

public static void main (String args[])
{
    Quote_Saver qd= new Quote_Saver();
    String data = qd.retrieveQuote();
    qd.ConnectionToMysql(data);
}

}

The error is 错误是

java.sql.SQLException: No value specified for parameter 5
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1086)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2594)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2569)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2415)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2366)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2350)
at Quote_Saver.ConnectionToMysql(Quote_Saver.java:68)
at Quote_Saver.main(Quote_Saver.java:89)

But clearly, the string fields only has size of 4,so does my table columns, so my question is where is the parameter 5? 但显然,字符串字段的大小只有4,我的表列也是如此,所以我的问题是参数5在哪里? and how to solve this? 以及如何解决这个问题? I'm new to java,plz help me. 我是java的新手,请帮助我。 Thanks a lot! 非常感谢!

Actually, you just made a minor mistake - probably a copy paste error. 实际上,你只是犯了一个小错误 - 可能是一个复制粘贴错误。

The following line requires 8 parameters instead of 4 because you put question marks where you should have put column names. 以下行需要8个参数而不是4个,因为您将问号放在应该放置列名的位置。

insert into `stocks`(?,?,?,?) values (?,?,?,?);";

If you modify it as follows (replacing the column names with your real names from the stocks table) then it should function as you were expecting. 如果您按如下方式修改它(用库表中的真实名称替换列名称),那么它应该按照您的预期运行。

insert into stocks(ColumnNameOne, ColumnNameTwo, ColumnNameThree, ColumnNameFour)
values (?, ?, ?, ?);

Your sending 8 parameters by using, because each ? 你使用发送8个参数,因为每个? represent a parameter that required a value to be set at Run time. 表示需要在运行时设置值的参数。

String query = "insert into `stocks`(?,?,?,?) values (?,?,?,?);";

Your query should look like this: 您的查询应如下所示:

String query = "insert into `stocks`(clmName1, clmName2, clmName3, clmName4) values (?,?,?,?);";

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM