データベースに到達し、Java フォームの入力に基づいて結果セットを引き出すことを目的とした非常に単純な Java アプリケーションがあります。ただし、SQL ステートメントにパラメーターを追加すると、レコードセット内の最終レコードが失われて終了します (ただし、適切な結果が得られるように見えます)。
以下のコードは、(予想どおり) 上部に例があり、データセット全体になります。
Name|Location|Details
A|Here|7854
A|There|7854
B|Here|8761
C|Gone|5312
public void actionPerformed(ActionEvent e) {
try {
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=$DBname;user=$user;password=$password";
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
Class.forName(driver).newInstance();
Connection dbconn = DriverManager.getConnection(url);
Statement stmt = dbconn.createStatement();
ResultSet rs;
rs = stmt.executeQuery("SELECT * from schema.table");
tblServers.setModel(buildTableModel(rs));
dbconn.close();
} catch (Exception f) {
System.err.println("Downloading Servers from the Database Failed! ");
System.err.println(f.getMessage());
}
}
private DefaultTableModel buildTableModel(ResultSet rs) throws SQLException {
ResultSetMetaData rsmetaData = rs.getMetaData();
//Get Column Names
int numCols = rsmetaData.getColumnCount();
Vector<String> columnNames = new Vector<String>();
for (int column = 1; column <= numCols; column++) {
columnNames.add(rsmetaData.getColumnName(column));
}
//Iterate through rows
Vector<Object> data = new Vector<Object>();
while (rs.next()) {
Vector<Object> rows = new Vector<Object>();
for (int colIndex = 1; colIndex <= numCols ; colIndex++) {
rows.add(rs.getObject(colIndex));
}
data.add(rows);
}
return new DefaultTableModel(data, columnNames);
}
}
);
ここで、SQL 行だけを「where」句を含む任意のバリアントに変更すると、次のようになります。
rs = stmt.executeQuery("SELECT * from schema.table where name = 'A'");
私は得る:
Name|Location|Details
A|Here|7854
または、B を検索しても結果が得られません。
Name|Location|Details
|||
どんなアイデアでも大歓迎です。これは非常に単純なことだと確信しています。
@Sasha: はい、確かに 1 つの結果が得られています。私は多くの順列を試しましたが、常に空白の結果セット (ただし、正確なヘッダーを含む) またはヘッダーと結果セットから最終行を除いた結果になります。
@PM77-1: コードが戻り値 (data, ColumnNames) を返すとすぐに、私の JTable は結果セットをユーザーに表示します。
@Glenn: あなたの提案で、「return new DefaultTableModel」の直前に System.out.println(data) と「System.out.println(rs)」を追加しました。出力はそれぞれ [] と SQLServerResultSet:1 です。
@JohnnyAW where句を使用した結果は、上記の私のコメントと同じです-syslogに「テスト」は表示されません。where句を削除すると、レコードの前に「test」が付いた一連のsyslogエントリが取得されます。
訂正: 8 つのテストの合計、つまりテスト レコードセット全体に対して "testtesttest" を取得します。Where 句があると、1 つのテストが失敗します。