Как получить данные из таблицы БД между двумя конкретными датами (указанными пользователем) с помощью оператора SQL?

Вот мой код.. Я получил ошибку

"Ошибка UCanAccess - net.ucanaccess.jdbc.UcanaccessSQLException: несовместимый тип данных в операции: в следующей строке..

PreparedStatement pStmt = conn.prepareStatement(sql)

public void showCeilingMaterials(Site_Details site_detail) 
{
    String sql="SELECT SiteName, SUM(PlanTileQuantity), SUM(PlanTilePrice), SUM(PellingQuantity),SUM(PellingPrice), SUM(PowderQuantity),SUM(PowderPrice),SUM(LpattiQuantity),SUM(LpattiPrice),LpattiSize,SUM(CeilingTotalPrice) FROM CeilingMaterials Where SiteName='?' AND Date<='?' AND Date>=?";
        try (PreparedStatement pStmt = conn.prepareStatement(sql)) {
            SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
            java.util.Date parsed = format.parse(site_detail.getStartDate());
            java.sql.Date sql_date1 = new java.sql.Date(parsed.getTime());
            format.format(sql_date1);
            java.util.Date parsed1 = format.parse(site_detail.getEndDate());
            java.sql.Date sql_date2 = new java.sql.Date(parsed1.getTime());
            format.format(sql_date2);
            pStmt.setString(1, site_detail.getSiteName());
            pStmt.setDate(2, sql_date1);
            pStmt.setDate(2,sql_date2);
            ResultSet rs= pStmt.executeQuery();
            while(rs.next()){
                showCeil.setSiteName(rs.getString("SiteName"));
                showCeil.setTileQuantity(rs.getString("PlanTileQuantity"));
                showCeil.setTilePrice(rs.getString("PlanTilePrice"));
                showCeil.setPellingQuantity(rs.getString("PellingQuantity"));
                showCeil.setPellingPrice(rs.getString("PellingPrice"));
                showCeil.setLpattiQuantity(rs.getString("LpattiQuantity"));
                showCeil.setLpattiPrice(rs.getString("LpattiPrice"));
                showCeil.setLpattiSize(rs.getString("LpattiSize"));
                showCeil.setPowderQuantity(rs.getString("PowderQuantity"));
                showCeil.setPowderPrice(rs.getString("PowderPrice"));
                showCeil.setTotalCeilingPrice(rs.getString("CeilingTotalPrice"));
                show_ceil_w=new Site_Details_Show_Interface();
                show_ceil_w.showGui(showCeil);
            }
        }
    }

1 ответ

Решение

Текст команды SQL для параметризованного запроса никогда не должен включать кавычки (или другие разделители) вокруг заполнителей параметров. У вас есть следующее, что неверно:

... Where SiteName='?' AND Date<='?' AND Date>=?

В частности, это Date<='?' это вызывает ошибку, процитированную в вопросе, хотя сообщение об ошибке немного отличается в более новых версиях UCanAccess (в данном случае v3.0.2):

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.2 несовместимые типы данных в комбинации

Вместо этого вам нужно иметь

... Where SiteName=? AND [Date]<=? AND [Date]>=?

[Обратите внимание, что Date является зарезервированным словом (именем встроенной функции) в Access, поэтому вы должны использовать квадратные скобки вокруг него, если вы хотите обратиться к столбцу с именем Date .]

Как только эта ошибка исправлена, другие ошибки в вашем SQL проявляют себя. Следующий, который вам нужно будет адресовать:

net.ucanaccess.jdbc.UcanaccessSQLException: выражение UCAExc:::3.0.2 не в статистических столбцах или столбцах GROUP BY: PUBLIC.CEILINGMATERIALS.SITENAME

потому что вы включили SiteName в вашем списке столбцов, которые будут возвращены, но это не является частью агрегатной функции (например, MIN(), MAX()) или предложение GROUP BY. У вас та же проблема с LpattiSize также.

У вас также есть

pStmt.setDate(2, sql_date1);
pStmt.setDate(2,sql_date2);

где вы присвоили значение параметру № 2 дважды (поэтому параметр № 3 не имеет значения).

Наконец, имейте в виду, что когда вы SUM() столбец без предоставления псевдонима, как в

SELECT ... SUM(PlanTileQuantity), ...

результирующий столбец не будет называться "PlanTileQuantity". UCanAccess назначит ему имя столбца произвольного типа, например "C1", "C2" и т. Д. Всегда лучше явно назначить псевдоним, например,

SELECT ... SUM(PlanTileQuantity) AS SumOfPlanTileQuantity, ...
Другие вопросы по тегам