gpt4 book ai didi

java.sql.SQLException : No value specified for parameter 5, 但字符串长度为 4,而不是 5

转载 作者:可可西里 更新时间:2023-11-01 07:46:36 24 4
gpt4 key购买 nike

我计划使用 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”。代码如下: 公共(public)课 Quote_Saver { 私有(private)无效连接(){ 尝试 { Class.forName("com.mysql.jdbc.Driver"); } 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);
}

}

错误是

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的新手,请帮助我。非常感谢!

最佳答案

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

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

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

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

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

关于java.sql.SQLException : No value specified for parameter 5, 但字符串长度为 4,而不是 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22287160/

24 4 0