PreparedStatement setString不起作用,仍有问号

时间:2018-03-29 06:31:36

标签: sql postgresql jdbc prepared-statement setstring

我目前正在开发一个带有数据库的项目,后面我想用这个方法按照coloums订购文件: 由于这个原因,方法头中有4个不同的参数,第一个用于连接,下一个是参数是用户名,因为只有上传文件的人才能看到文件而下一个是coloum数据库中的表,下一个是ASC或DESC。

public ArrayList<Daten> meineDaten(Connection conn,String sortierparameter,String spalte,String reihung)
    {
        //generieren einer ArrayList zum Zwischenspeichern von den Werten aus der Datenbank
        ArrayList<Daten> DatenSortiertPrivate = new ArrayList<>();
        String READ_DATEN_PRIVATE = null;

        //SQL-Abfrage
        if(reihung.equals("ASC"))
        {
            READ_DATEN_PRIVATE="select uploadid,dateityp, dateiname, autor, uploaddatum, dokumentdatum, status from uploaddaten where uploader= ? and zustand='true' order by ? ASC;";
        }
        else if(reihung.equals("DESC")){
            READ_DATEN_PRIVATE="select uploadid,dateityp, dateiname, autor, uploaddatum, dokumentdatum, status from uploaddaten where uploader= ? and zustand='true' order by ? DESC;";
        }

        //READ_DATEN_PRIVATE="select uploadid,dateityp, dateiname, autor, uploaddatum, dokumentdatum, status from uploaddaten where uploader=? and zustand='true' order by ? ?;";

        try {
            pstmt = conn.prepareStatement(READ_DATEN_PRIVATE);
            pstmt.setString(1, sortierparameter);
            pstmt.setString(2, spalte);
            rs = pstmt.executeQuery();
            System.out.println("SQL: "+READ_DATEN_PRIVATE);
            while(rs.next())
            {
                int uploadid = rs.getInt(1);
                String dateityp = rs.getString(2);
                String dateiname = rs.getString(3);
                String autor = rs.getString(4);
                String uploaddatum = rs.getString(5);
                String dokumentdatum = rs.getString(6);
                String status = rs.getString(7);

                Daten zeile = new Daten(uploadid,dateityp,dateiname, autor, uploaddatum, dokumentdatum, status);
                DatenSortiertPrivate.add(zeile);
            }

            pstmt.close(); pstmt=null;
            rs.close();rs=null;
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return DatenSortiertPrivate;

    }

我不知道为什么会这样: SQL Daten auf网站angebenselect uploadid,dateityp,dateiname,autor,uploaddatum,dokumentdatum,来自uploaddaten的状态uploader =?和zustand =&#39; true&#39;订购? ASC;

例如,通过&#34; dateiname&#34;用户名是thoker和ASC。

点击按钮即可使用此方法。

P.S。抱歉我的英文不好

2 个答案:

答案 0 :(得分:1)

您正在打印READ_DATEN_PRIVATE。在pstmt之后打印prepareStatement,然后您可以查看更新的查询

 System.out.println("SQL Daten auf Website angeben Before"+READ_DATEN_PRIVATE);
        try {
            pstmt = conn.prepareStatement(READ_DATEN_PRIVATE);
            pstmt.setString(1, sortierparameter);
            pstmt.setString(2, spalte);
            rs = pstmt.executeQuery();
            System.out.println("After Change:" + pstmt);

答案 1 :(得分:0)

长答案简短:

  

您无法在两个查询中替换order by ?中的值。

原因:

占位符?可应用于列的参数,但

  1. 列名或表名,
  2. 对列或排序顺序(您的情况)或
  3. 进行排序
  4. SQL函数/子句。
  5. 因此,要解决主要问题,请与order by ?交换"... order by " + sortierparameter + "...。但是,应仔细检查此值以避免运行时出错。通过Enum更好地定义允许的排序顺序参数。

    请参阅Oracle Using Prepared Statements上的教程以供参考。

    旁注

    您应该尊重代码中参数占位符的顺序:

    pstmt.setString(1, sortierparameter);
    pstmt.setString(2, spalte);
    
    鉴于语义(以及“sortierparameter”的德语翻译),

    是错误的。您错误地将pstmt.setString(2, spalte);设置为第二个参数。

    我认为它必须如下所示pstmt.setString(1, spalte);,假设您想要设置uploader= ?,并且假设您修复了上述方法的主要问题。

    希望它有所帮助。