【发布时间】:2019-12-08 12:21:27
【问题描述】:
我的应用程序搜索查询有问题。我希望能够使用表单搜索多个字段并将它们显示在表格中。表单基本上在文本字段和组合框中。请协助。这是我的代码:
当我点击搜索按钮时,错误是:
com.microsoft.sqlserver.jdbc.SQLServerException: 未为参数号 1 设置值。
btnSearch = new JButton("SEARCH");
btnSearch.setFont(new Font("Verdana", Font.PLAIN, 13));
btnSearch.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
ArrayList<Transmittal> getTransmittal;
try{
Connection connection = ConnectDB.getConnection();
StringJoiner sj = new StringJoiner (" AND ");
String query = "SELECT TRANSMITTAL_ID AS \"TRANSMITTAL ID\", TRANSMITTAL_TYPE AS \"TRANSMITTAL TYPE\", TITLE, PURPOSE, ORIGINAL_TRANSMITTAL_ID AS \"TRANSMITTAL REFERENCE\","
+ "COUNTRY, AREA, DATA_TYPE AS \"DOCUMENT TYPE\", PAC, TAPE_3590 AS \"3590\", TAPE_3592 AS \"3592\", HDD, CD, HARDCOPY, OTHERS, "
+ "SENDER, SENDER_COMP AS \"SENDER'S COMPANY\", DATE_SEND AS \"DATE SEND\", RECEIVER, RECEIVER_COMP AS \"RECEIVER'S COMPANY\", DATE_RECEIVED AS \"DATE RECEIVED\", REMARKS, TRANSMITTAL_FILE_LINK AS \"TRANSMITTAL LINK\" "
+ "FROM TRANSMITTAL_TABLE WHERE ";
List values = new ArrayList();
if((textFieldTransmittalID != null) && (!textFieldTransmittalID.getText().isEmpty())){
sj.add("TRANSMITTAL_ID LIKE ?");
values.add(textFieldTransmittalID);
}
if((comboBoxTType != null) || (comboBoxTType.getItemCount() != -1)) {
sj.add("TRANSMITTAL_TYPE LIKE ?");
values.add(comboBoxTType);
}
if((textFieldTitle != null) || (!textFieldTitle.getText().isEmpty())){
sj.add("TITLE LIKE ?");
values.add(textFieldTitle);
}
if((comboBoxPurpose != null) && (comboBoxPurpose.getItemCount() != 0)){
sj.add("PURPOSE LIKE ?");
values.add(comboBoxPurpose);
}
if((textFieldTRef != null) && (!textFieldTRef.getText().isEmpty())){
sj.add("ORIGINAL_TRANSMITTAL_ID LIKE ?");
values.add(textFieldTRef);
}
if((comboBoxSender != null) && (comboBoxSender.getItemCount() != 0)){
sj.add("SENDER LIKE ?");
values.add(comboBoxSender);
}
if((textFieldSComp != null) && (!textFieldSComp.getText().isEmpty())){
sj.add("SENDER_COMP LIKE ?");
values.add(textFieldSComp);
}
if((comboBoxReceiver != null) && (comboBoxReceiver.getItemCount() != 0)){
sj.add("RECEIVER LIKE ?");
values.add(comboBoxReceiver);
}
if((textFieldRComp != null) && (!textFieldRComp.getText().isEmpty())){
sj.add("RECEIVER_COMP LIKE ?");
values.add(textFieldRComp);
}
if((textFieldRemarks != null) && (!textFieldRemarks.getText().isEmpty())){
sj.add("REMARKS LIKE ?");
values.add(textFieldRemarks);
}
if((textField3590 != null) && (!textField3590.getText().isEmpty())){
sj.add("TAPE_3590 LIKE ?");
values.add(textField3590);
}
if((textField3592 != null) && (!textField3592.getText().isEmpty())){
sj.add("TAPE_3592 LIKE ?");
values.add(textField3592);
}
if((textFieldHdd != null) && (!textFieldHdd.getText().isEmpty())){
sj.add("HDD LIKE ?");
values.add(textFieldHdd);
}
if((textFieldCd != null) && (!textFieldCd.getText().isEmpty())){
sj.add("CD LIKE ?");
values.add(textFieldCd);
}
if((textFieldOthers != null) && (!textFieldOthers.getText().isEmpty())){
sj.add("OTHERS LIKE ?");
values.add(textFieldOthers);
}
if((textFieldHardcopy != null) && (!textFieldHardcopy.getText().isEmpty())){
sj.add("HARDCOPY LIKE ?");
values.add(textFieldHardcopy);
}
if((textFieldArea != null) && (!textFieldArea.getText().isEmpty())){
sj.add("AREA LIKE ?");
values.add(textFieldArea);
}
if((textFieldPac != null) && (!textFieldPac.getText().isEmpty())){
sj.add("PAC LIKE ?");
values.add(textFieldPac);
}
if((comboBoxCountry != null) && (comboBoxCountry.getItemCount() != 0)){
sj.add("COUNTRY LIKE ?");
values.add(comboBoxCountry);
}
if((textFieldDataType != null) && (!textFieldDataType.getText().isEmpty())){
sj.add("DATA_TYPE LIKE ?");
values.add(textFieldDataType);
}
if((textFieldTLink != null) && (!textFieldTLink.getText().isEmpty())){
sj.add("TRANSMITTAL_FILE_LINK LIKE ?");
values.add(textFieldTLink);
}
query += sj.toString();
try(PreparedStatement pst = connection.prepareStatement(query)){
for (int index = 1; index > values.size(); index++){
pst.setObject(index + 1, values.get(index));
}
try (ResultSet rs = pst.executeQuery()){
if (rs.next()) {
tableAsset.setModel(DbUtils.resultSetToTableModel(rs));
}
}
pst.setString(1, textFieldTransmittalID.getText());
pst.setString(2, comboBoxTType.getSelectedItem().toString());
pst.setString(3, textFieldTitle.getText());
pst.setString(4, comboBoxPurpose.getSelectedItem().toString());
pst.setString(5, textFieldTRef.getText());
pst.setString(6, comboBoxSender.getSelectedItem().toString());
pst.setString(7, textFieldSComp.getText());
pst.setString(8, comboBoxReceiver.getSelectedItem().toString());
pst.setString(9, textFieldRComp.getText());
pst.setString(10, textFieldRemarks.getText());
pst.setInt(11, Integer.parseInt(textField3590.getText()));
pst.setInt(12, Integer.parseInt(textField3592.getText()));
pst.setInt(13, Integer.parseInt(textFieldHdd.getText()));
pst.setInt(14, Integer.parseInt(textFieldCd.getText()));
pst.setInt(15, Integer.parseInt(textFieldOthers.getText()));
pst.setInt(16, Integer.parseInt(textFieldHardcopy.getText()));
pst.setString(17, textFieldArea.getText());
pst.setString(18, textFieldPac.getText());
pst.setString(19, comboBoxCountry.getSelectedItem().toString());
pst.setString(20, textFieldDataType.getText());
pst.setString(21, textFieldTLink.getText());
try (ResultSet rs = pst.executeQuery()){
if(rs.next()){
ResultSet rst = pst.executeQuery();
tableAsset.setModel(DbUtils.resultSetToTableModel(rst));
}
}
} catch(SQLException exp){
exp.printStackTrace();
JOptionPane.showMessageDialog(null, exp);
}
} catch(Exception e){
e.printStackTrace();
JOptionPane.showMessageDialog(null, e);
}
}
});
我希望能够在表单中搜索2或3个字段,结果应该显示在表格中。
【问题讨论】:
-
请注意,您构建 SQL 字符串的方法对 SQL 注入相当开放。