【问题标题】:Fail to convert to internal representation JDBC无法转换为内部表示 JDBC
【发布时间】:2013-11-27 21:53:05
【问题描述】:

好的,这是我的代码

public static ArrayList getMaterialerFraOrdreNr(String s_date, String e_date) throws SQLException, InterruptedException {
    int tal = 0;

    ArrayList nameOfColumns = getNameOfColumns();                     // name of columns
    ArrayList orderNumber = getOrdre_Nr_FromDB(s_date, e_date);           // order number 

    //første loop kører gennem number of columns
    //anden loop kører gennem name of column
    ResultSet rs = null;
    Connection con = null;

    try {
        Class.forName(DB.driver);
        con = DriverManager.getConnection(DB.URL, DB.ID, DB.PW);

        for (int i = 1; i < orderNumber.size(); i++) {
            for (int j = 1; j < nameOfColumns.size(); j++) {

                String nameOfColum = (String) nameOfColumns.get(i);
                int orderNr = (Integer) orderNumber.get(j);
                System.out.println("orderNr  " + orderNr);
                //SELECT v1001 FROM ORDRE_spec WHERE  ordre_nr = 1;
                String query = "SELECT ? AS ans FROM ordre_spec WHERE ordre_nr = ?";
                PreparedStatement prest = con.prepareStatement(query);

                prest.setString(1, nameOfColum);
                prest.setInt(2, orderNr);
                System.out.println("orderNr  "  + orderNr);
                System.out.println("nameOfColum  =   " + nameOfColum);
                rs = prest.executeQuery();
                if(rs.next()){


                    tal = rs.getInt("ans");

                    MaterialeNum.add(tal);
                    System.out.println("materiale num =    " + MaterialeNum);

                }
            }

        }

    } catch (ClassNotFoundException | SQLException ee) {
        System.out.println("fail og der er så her");
        System.err.println(ee);
    } finally {

        con.close();
    }
    System.out.println(kundeNum.toString());
    return kundeNum;

}

public static void main(String[] args) throws SQLException, InterruptedException {

    NewClass.getMaterialerFraOrdreNr("1990-10-10", "2020-10-10");

}

我的问题是我得到一个 java.sql.SQLException: Fail to convert to internal representation

我真的看不出错误应该是什么..如果你能看到错误请帮忙:)

【问题讨论】:

  • 请在您的 catch 块中添加一个 printStackTrace 语句。重新运行你的程序,并告诉我们异常。异常可能会告诉发生异常的行
  • 当数据库中的类型与您 rs.getXXX() rs.setXXX() 类型不兼容时,通常会引发该异常。告诉我们您的表的架构。
  • 这是 StackTrace java.sql.SQLException:无法转换为内部表示 java.lang.Throwable:打印堆栈跟踪:在 com.sun.corba.se.impl.util.Utility.printStackTrace (Utility.java:933) 在 data.NewClass.getMaterialerFraOrdreNr(NewClass.java:192) 在 data.NewClass.main(NewClass.java:204)
  • 您选择的所有列是否都包含整数?在我看来,如果“ans”包含字符串,“tal = rs.getInt("ans")”可能会不高兴。
  • 第一个?是表中列的名称。第二个是订单号.. 我需要的只是这两个碰撞的 int

标签: java sql jdbc


【解决方案1】:
String query = "SELECT ? AS ans FROM ordre_spec WHERE ordre_nr = ?";

您不能参数化列名。您只能参数化列值。

基本上你需要做的:

String query = "SELECT " + nameOfColum + " AS ans FROM ordre_spec WHERE ordre_nr = ?";

请记住,如果 nameOfColum 可由最终用户控制,则这很容易发生 SQL 注入。如果确实如此,您可能希望在例如执行字符串匹配。 \w+ 然后继续。

【讨论】:

  • +1 就是这样。准确地说,您通常可以参数化文字值(不仅是列值),但您不能构建动态语句。
  • 无论如何用户都不应该使用数据进行操作。我只是想试试这个:)
  • 现在我的索引越界了... :)
  • 也就是说,原来的问题已经解决了,这个问题也有了答案。如果您无法通过谷歌搜索或逻辑思考找出新问题的解决方案,那么只需按右上角的“”:)
猜你喜欢
  • 2012-02-04
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
相关资源
最近更新 更多