问题似乎与 setInt 和 setString 方法中的“通用”语法有关。- 当然,也可能是其他问题,但让我告诉你我发现了什么。
下面是我在 mySql 中尝试使用 java 查询的表。
Id | CashFlowSensitive | Sp1
-----------------------------------
37 | 1 | Hello
1000 | 0 | Hello
1401 | 0 | number3
1500 | 0 | number4
1504 | 1 | Hello
如果我的代码像“给我所有 CashFlowSensitive=1 和 Sp1 =”Hello”的行,那么我的代码就可以工作。它给了我第一行和最后一行,因为它们完全符合过滤条件。
现在,假设我更改了表中的最后一行,替换Hello
了number5
. 然后表格看起来像这样
Id | CashFlowSensitive | Sp1
-----------------------------------
37 | 1 | Hello
1000 | 0 | Hello
1401 | 0 | number3
1500 | 0 | number4
1504 | 1 | number5
最后我启动我的查询,要求它给我所有“CashFlowSensitive”= 1 的行。我应该得到 37 和 1504。遗憾的是,这给出了一个空的结果集。我的 JTable 是空的。在这个失败的例子中,我这样做:
public void searchStringTest( DefaultTableModel model, Database db, int CashFlowSensitive, String Sp1 )
{
int first = -77;
String second = "-55";
String queryTest = " select * from helm.activitiesextended where CashFlowSensitive = ? and Sp1 = ? ";
try
{
java.sql.PreparedStatement selectStmt = CON.prepareStatement( queryTest );
if ( first == -77 ) {
((PreparedStatement) selectStmt).setInt(1, 1 );
} else {
((PreparedStatement) selectStmt).setInt(1, '%' + CashFlowSensitive + '%' );
}
if ( second == "-77" ) {
((PreparedStatement) selectStmt).setString(2, "Hello");
} else {
((PreparedStatement) selectStmt).setString(2, "%" + Sp1 + "%" );
}
ResultSet rsTest = selectStmt.executeQuery();
model.setRowCount(0);
while ( rsTest.next())
{
Vector <Object> vector = new Vector<Object>();
for ( int columnIndex = 1; columnIndex <=4; columnIndex ++ )
{
vector.add( rsTest.getObject ( columnIndex ) );// pick next column
}
data.add(vector);
model.addRow(vector);
}
我有一个 searchString 声明为(int CFS、int ToBeMonitored、String Sp1、String Sp2、String Sp3 和另外 7 个参数)我将查询字符串定义为: select * from table where CFS = ? 和 ToBeMonitored = ? 和 Sp1 = ? 和 Sp2 = ? 和 Sp3 = ? 等枚举十个参数。现在,在这个查询的任何给定运行中,我只激活最多 4 个参数,例如说我想过滤掉 2 par: CFS 和 Sp1,其余参数应该对过滤过程是中性的,我称之为 'neutral' 。在这样做时,我设置了准备好的语句 ((PreparedStatement)selectStmt).setInt(1, 1);// 过滤这个 ((PreparedStatement)selectStmt).setInt(2, '%' + ToBeMonitored + '%'); // 接受任何值 ((PreparedStatement)selectStmt).setString(3, "Hello"); // 过滤这个 ((PreparedStatement)selectStmt).setString(4, "%" + Sp2 + "%"); ((PreparedStatement)selectStmt).setString(5, "%" + Sp3 + "%"); 正如您所看到的,我正在关注我的 sql 以尊重参数 1 和 3,同时忽略其他参数,从而使它们在过滤过程中保持中立。问题:尽管数据有效,但没有创建结果集。
你的回答有点偏离我提出的问题。我希望您尊重这样一个事实,即无论我想在每次单独运行时过滤哪些参数,都将一遍又一遍地保留相同的查询字符串。例如,如果我只“打开” CashFlowSensitive 标志,那么在运行查询时该特定参数应该是活动参数。其他参数应该以中性方式表现过滤过程。在其他时候,我可能会选择激活 Sp1 字段(一个 CHAR 字段),然后其他字段应该处于休眠状态。在其他情况下,我可能会选择几个字段的组合,那些应该是活动的,而未选择的字段应该是中性的。让我缩小你的任务范围。1) 告诉我如何使用绑定参数查询 CHAR 字段,其中字段在过滤过程中应该是中性的,