当前位置: 首页 > 知识库问答 >
问题:

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

步建茗
2023-03-14

我计划使用yahoo finance csv api生成url,以获取股票的实时价格和时间。url是这样的http://download.finance.yahoo.com/d/quotes.csvs=@%5YHOO、GOOG、MSFT、BAC

我使用jdbc将数据存储到MySQL,但是总是有一个错误:“没有为参数5指定值”。代码如下:公共类Quote_Saver{私有无效连接(){try{Class.for名称(com.mysql.jdbc.驱动程序);}捕获(ClassNotFoundExcema 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在哪里?如何解决这个问题?我是新来的,请帮帮我。非常感谢!

共有2个答案

史阳晖
2023-03-14

您可以使用发送8个参数,因为每个 表示需要在运行时设置值的参数。

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

您的查询应该如下所示:

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

轩辕庆
2023-03-14

实际上,您只是犯了一个小错误—可能是复制粘贴错误。

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

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

如果您按照以下方式修改它(用股票表中的真实姓名替换列名),那么它应该像您预期的那样运行。

insert into stocks(ColumnNameOne, ColumnNameTwo, ColumnNameThree, ColumnNameFour)
values (?, ?, ?, ?);
 类似资料:
  • 问题内容: 我在执行应用程序时遇到以下错误: java.sql.SQLException:未为参数1指定值 这是什么意思? 我在岛上的清单: 我在托管bean中获得的用户组列表: 我的JSF页面: 我的数据表能够显示数据库中的组列表。但是,当我在数据表中选择单个行时,应用程序需要一些时间才能与数据库建立连接以显示所选结果。 另外,奇怪的是,该应用程序能够比其他应用程序更快地显示某些选定的结果。与我

  • 我有一个简单的不透明度滑块使用反应钩,看起来像这样 我在像这样的表中设置不透明度 但当我运行我的应用程序时,DOM中的不透明度显示为一个字符串,如下所示 为什么不透明度值显示为字符串而不是数字?

  • 我知道很多人问过相关的问题,但请帮我解决。我试图复制一个我在网上找到的开源温度控制实验室。我想在树莓皮上运行它。这就是我一直遇到的错误: 生成它的代码如下所示: 我相信这段代码试图通过以下代码与另一个python文件通信: 我还不知道我周围的python代码,所以一个非常清晰的“虚拟类”解决方案的解释会很有帮助。谢谢伙计们。

  • 我想对一个浮点数进行四舍五入,得到点后的两位数。但我收到了一个错误: float()参数必须是字符串或数字,而不是“NoneType” 在评级模型的评级字段中四舍五入是一个坏主意,因为平均_评级不会四舍五入

  • 原因:java.lang.ArrayIndexOutOfBoundsException:length=5;在com.example.android.architecture.mainactivity.updateDisplay(mainactivity.kt:59)在com.example.android.architecture.mainactivity.oncreate(mainactivit

  • 问题内容: 在.NET Framework 的参考中,使用type 声明请求类型。 在RFC 2616 中,声明了所有HTTP请求方法(例如POST,GET,PUT,DELETE …)。 .NET 和类中也存在类似的行为。 Java在方法上有类似的方法。 这些语言设计者为什么不考虑为这些HTTP方法实现枚举? 你有好主意吗? 问题答案: RFC 2616 链接的第一句话(添加了重点): HTTP