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

本文介绍了Java新手在使用JDBC将数据从CSV文件导入MySQL时遇到的‘没有为参数5指定值’错误。问题在于PreparedStatement的参数数量与列数不符。通过修正SQL语句并确保所有字段对应参数,解决了这个错误。
摘要由CSDN通过智能技术生成

我使用jdbc将数据存储到Mysql,但始终存在错误:“没有为参数5指定值”.代码如下:

公共类Quote_Saver {

private void connection(){

尝试{

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

如果您按如下方式修改它(用库表中的真实名称替换列名称),那么它应该按照您的预期运行.

insert into stocks(ColumnNameOne, ColumnNameTwo, ColumnNameThree, ColumnNameFour)

values (?, ?, ?, ?);

标签:java,mysql,sql,csv,jdbc

来源: https://codeday.me/bug/20190713/1454270.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值