【问题标题】:java.sql.SQLException: No value specified for parameter 5, but the string length is 4, not 5java.sql.SQLException:没有为参数5指定值,但是字符串长度是4,而不是5
【发布时间】:2014-04-12 18:55:24
【问题描述】:

我计划使用 yahoo Finance csv api 生成 url 以获取股票实时价格和时间。 url 是这样的http://download.finance.yahoo.com/d/quotes.csvs=%40%5YHOO,GOOG,MSFT,BAC&f=nsl1o&e=.csv,它返回一个有 4 列的表。

我使用jdbc将数据存储到Mysql,但是总是报错:“No value specified for parameter 5”。代码如下: 公共类 Quote_Saver { 私人无效连接(){ 尝试 { Class.forName("com.mysql.jdbc.Driver"); } 捕捉(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);
}

}

错误是

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)

但是很明显,字符串字段的大小只有4,我的表格列也是如此,所以我的问题是参数5在哪里?以及如何解决这个问题?我是java新手,请帮助我。非常感谢!

【问题讨论】:

    标签: java mysql sql csv jdbc


    【解决方案1】:

    其实你只是犯了一个小错误——可能是复制粘贴错误。

    以下行需要 8 个参数而不是 4 个参数,因为您在应该放置列名的位置放置了问号。

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

    如果您按如下方式修改它(将列名替换为stocks 表中的真实姓名),那么它应该可以按照您的预期运行。

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

    【讨论】:

      【解决方案2】:

      您通过使用发送 8 个参数,因为每个 ? 代表一个需要在运行时设置值的参数。

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

      您的查询应如下所示:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        • 2013-07-22
        相关资源
        最近更新 更多