Как получить данные из таблицы БД между двумя конкретными датами (указанными пользователем) с помощью оператора 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, ...