This is how I handle mine modified for your application.
import java.sql.*;

public class DBUtil {

/** Retrieves results from query as a DBResults class.

*/

public static DBResults getQueryResults(String query, String dBase) {

Connection connection = Conn.getConn(dBase);

Statement statement = null;

ResultSet resultSet = null;

DBResults dbResults = null;

boolean good = false;

try {

DatabaseMetaData dbMetaData = connection.getMetaData();

String productName = dbMetaData.getDatabaseProductName();

String productVersion = dbMetaData.getDatabaseProductVersion();

statement = connection.createStatement();

resultSet = statement.executeQuery(query);

ResultSetMetaData resultsMetaData = resultSet.getMetaData();

int columnCount = resultsMetaData.getColumnCount();

String[] columnNames = new String[columnCount];

// Column index starts at 1 (a la SQL) not 0 (a la Java).

for (int i = 1; i < columnCount + 1; i++) {

columnNames[i - 1] = resultsMetaData.getColumnName(i).trim();

}

dbResults =

new DBResults(

connection,

productName,

productVersion,

columnCount,

columnNames);

while (resultSet.next()) {

String[] row = new String[columnCount];

// Again, ResultSet index starts at 1, not 0.

for (int i = 1; i < columnCount + 1; i++) {

String entry = resultSet.getString(i);

if (entry != null) {

entry = entry.trim();

}

row[i - 1] = entry;

}

dbResults.addRow(row);

}

good = true;

} catch (SQLException sqle) {

System.err.println("Error connecting: " + sqle);

} finally {

// Always make sure result sets and statements are closed,

// and the connection is returned to the pool

if (resultSet != null) {

try {

resultSet.close();

} catch (SQLException e) {

System.err.println("DataBaseUtilities Error closing resultset: " + e);

}

resultSet = null;

}

if (statement != null) {

try {

statement.close();

} catch (SQLException e) {

System.err.println("DataBaseUtilities Error closing statement: " + e);

}

statement = null;

}

if (connection != null) {

try {

connection.close();

} catch (SQLException e) {

System.err.println("DataBaseUtilities Error closing connection: " + e);

}

connection = null;

}

if (good)

return (dbResults);

else

return (null);

}

}

/** Runs update query.

*/

public static void setUpdate(String query, String dBase) {

Connection connection = Conn.getConn(dBase);

Statement statement = null;

boolean good = false;

try {

statement = connection.createStatement();

statement.executeUpdate(query);

} catch (SQLException sqle) {

System.err.println("Error connecting: " + sqle);

} finally {

// Always make sure statements are closed,

// and the connection is returned to the pool

if (statement != null) {

try {

statement.close();

} catch (SQLException e) {

System.err.println("DataBaseUtilities Error closing statement: " + e);

}

statement = null;

}

if (connection != null) {

try {

connection.close();

} catch (SQLException e) {

System.err.println("DataBaseUtilities Error closing connection: " + e);

}

connection = null;

}


}

}

}



And to handle the data from the resultset that would otherwise be
unaccessable it is places in an DBResults object.

package srm;

import java.sql.*;

import java.util.*;

/** Class to store completed results of a JDBC Query.

* Differs from a ResultSet in several ways:

* <UL>

* <LI>ResultSet doesn't necessarily have all the data;

* reconnection to database occurs as you ask for

* later rows.

* <LI>This class stores results as strings, in arrays.

* <LI>This class includes DatabaseMetaData (database product

* name and version) and ResultSetMetaData

* (the column names).

* <LI>This class has a toHTMLTable method that turns

* the results into a long string corresponding to

* an HTML table.

* </UL>

* <P>

* Taken from Core Servlets and JavaServer Pages

* from Prentice Hall and Sun Microsystems Press,

* http://www.coreservlets.com/.

* &copy; 2000 Marty Hall; may be freely used or adapted.

*/

public class DBResults {

private Connection connection;

private String productName;

private String productVersion;

private int columnCount;

private String[] columnNames;

private Vector queryResults;

String[] rowData;

public DBResults(Connection connection,

String productName,

String productVersion,

int columnCount,

String[] columnNames) {

this.connection = connection;

this.productName = productName;

this.productVersion = productVersion;

this.columnCount = columnCount;

this.columnNames = columnNames;

rowData = new String[columnCount];

queryResults = new Vector();

}

public void addRow(String[] row) {

queryResults.addElement(row);

}

public int getColumnCount() {

return(columnCount);

}

public String[] getColumnNames() {

return(columnNames);

}

public Connection getConnection() {

return(connection);

}

public String getProductName() {

return(productName);

}

public String getProductVersion() {

return(productVersion);

}

public String[] getRow(int index) {

return((String[])queryResults.elementAt(index));

}

public int getRowCount() {

return(queryResults.size());

}

/** returns the row and column equivelent from the DBResults */

public String getData(int r, int c){

return(((String[])queryResults.elementAt(r))[c]);

}


/** returns the row and column equivelent from the DBResults or empty string
if null or out of bounds*/

public String getDataP(int r, int c){

try{

return(((String[])queryResults.elementAt(r))[c]);

}catch(ArrayIndexOutOfBoundsException e){return "";}

}


/** Output the results as an HTML table, with

* the column names as headings and the rest of

* the results filling regular data cells.

*/


public String toHTMLTable(String headingColor) {

StringBuffer buffer =

new StringBuffer("<TABLE BORDER=1>\n");

if (headingColor != null) {

buffer.append(" <TR BGCOLOR=\"" + headingColor +

"\">\n ");

} else {

buffer.append(" <TR>\n ");

}

for(int col=0; col<getColumnCount(); col++) {

buffer.append("<TH>" + columnNames[col]);

}

for(int row=0; row<getRowCount(); row++) {

buffer.append("\n <TR>\n ");

String[] rowData = getRow(row);

for(int col=0; col<getColumnCount(); col++) {

buffer.append("<TD>" + rowData[col]);

}

}

buffer.append("\n</TABLE>");


return(buffer.toString());


}

}



This has one drawback, you cannot take advantage of an updatable recordset.
Any changes must be written back to the database with an update.

I added the getData(int,int) method to grab data using row, column position.
Note that these are 0 indexed not 1 indexed like a resultset.



> Todd,
>
> > SQLUtils.executeQuery("a SQL statement");
> > SQLUtils.executeUpdate("another one");
>
> Just out of curiosity, what do these methods return? If the former
> returns a ResultSet object, then you're in for a world of trouble. The
> ResultSet will never get closed, or you'll close the connection over
> which the ResultSet communicates, and then you're hosed, 'cause the
> calling code can't access the data.
>
> -chris
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to