jdbc选择查询不返回正确的值

时间:2017-04-10 13:37:04

标签: java sql user-interface jdbc

大家好,我遇到了一个问题。这是我正在使用的代码。

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

中这样做

3 个答案:

答案 0 :(得分:1)

此代码

while(rs.next()) {
    result = rs.getString("Quantity");
}

无法生成该异常,因为您将Stringrs.getString())放入StringString 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字段中连接。有人可以解释这有什么问题吗?