大家好,我遇到了一个问题。这是我正在使用的代码。
public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) {
if (newPropertyValue) {
}
else {
sku=skuTF.getText();
try {
String result = "";
String query = "select * from NextDoor where sku=" + sku;
System.out.println(query);
Statement s1 = con.createStatement();
ResultSet rs = s1.executeQuery(query);
while(rs.next()) {
result = rs.getString("Quantity");
}
curQuantityLabel.setText(result);
} catch(Exception e) {
e.printStackTrace();
}
}
}
问题出现在
行while(rs.next()) {
result = rs.getString("Quantity");}
我收到错误
com.microsoft.sqlserver.jdbc.SQLServerException: Conversion failed when converting the varchar value '60-214' to data type int.
它正在搜索值60-214,即使这不是我在GUI中输入的数字。我在查询中明确指定选择*用于由文本字段确定的特定sku。任何想法为什么会这样。
我在javafx和jre8
中这样做答案 0 :(得分:1)
此代码
while(rs.next()) {
result = rs.getString("Quantity");
}
无法生成该异常,因为您将String
(rs.getString()
)放入String
(String result = "";
)。
问题与sku
变量有关,而我的代码中的问题也是String
;你得到的例外是告诉SQL,你希望过滤sku
列的值是一个数字。
解决方案是检查skuTF.getText()
是否返回一个数字,并且仅在这种情况下将其传递给SQL查询;这样的事情可以起作用
public void changed(ObservableValue<? extends Boolean> arg0,
Boolean oldPropertyValue,
Boolean newPropertyValue) {
if (newPropertyValue) {
}
else {
sku=skuTF.getText();
try {
int num_sku = Integer.parseInt(sku);
String result = "";
String query = "select * from NextDoor where sku=" + num_sku;
System.out.println(query);
Statement s1 = con.createStatement();
ResultSet rs = s1.executeQuery(query);
while(rs.next()) {
result = rs.getString("Quantity");
}
curQuantityLabel.setText(result);
} catch(NumberFormatException e1){
/* do something else here */
} catch(Exception e) {
e.printStackTrace();
}
}
}
修改强>
正如其他人所说,PreparedStatements
是推荐的生成查询的方法,如果您的sku
列不是数字,使用它们会确保您的值放在查询中格式:
public void changed(ObservableValue<? extends Boolean> arg0,
Boolean oldPropertyValue,
Boolean newPropertyValue) {
if (newPropertyValue) {
}
else {
String sku = Integer.parseInt(skuTF.getText());
String result = "";
String query = "select * from NextDoor where sku = ?";
try(PreparedStatement stm = con.prepareStatement(query)){
stm.setString(1, sku);
System.out.println(query);
ResultSet rs = stm.executeQuery();
while(rs.next()) {
result = rs.getString("Quantity");
}
curQuantityLabel.setText(result);
} catch(Exception e) {
e.printStackTrace();
}
}
}
在你的第一次尝试中,你可能只是错过了sku值周围的引号
String query = "select * from NextDoor where sku = '" + sku + "'";
答案 1 :(得分:0)
为了避免这种错误,您必须使用PreparedStatement,它更有帮助并且可以保护您免受SQL注入,这是一个示例:
try (PreparedStatement stm = connection.prepareStatement(
"select * from NextDoor where sku = ?")) {
stm.setInt(1, Integer.parseInt(sku));//If your field of int type
//stm.setString(1, sku);//if your field of type varchar
ResultSet rs = stm.executeQuery();
while (rs.next()) {
result = rs.getString("Quantity");
}
}
您的错误发生是因为您尝试将字符串'60-214'
转换为int,所以在您必须检查您的值之前,我假设您的字段sku
是一个int但是{{1} }返回一个无效的int。
答案 2 :(得分:0)
这就是我最终做的事情
public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) {
if (newPropertyValue) {
}
else {
sku=skuTF.getText();
try {
String result = "";
PreparedStatement stmt = con.prepareStatement("select Quantity from NextDoor where sku = " + "'" + sku + "'");
ResultSet rs = stmt.executeQuery();
while(rs.next()) {
result = rs.getString("Quantity");
}
curQuantityLabel.setText(result);
} catch(Exception e) {
e.printStackTrace();
}
}
}
这有效,但这是否实用?我还在prepareStatement字段中连接。有人可以解释这有什么问题吗?