ResSet wird "vernichtet"

Status
Nicht offen für weitere Antworten.

Sanix

Top Contributor
Ich habe keine Ahnung wieso dieser *** Fehler auftritt.
Habe überall System.outs eingefügt um zu sehen wieso passiert. Wieso weiss ich nicht, aber wo. Es passiert genau hier:
Code:
Query qryInsert = new Query(oc, "Select * from gds.state");
Danach ist das resset vom qryFields weg. Das insert Query ist garantiert fehlerfrei, es meldet keinen und macht den Eintrag.
Ich kriege immer die Meldung:
SELECT * FROM GDS.STATE
ResSet4
INSERT INTO GDS.STATE (STATE_ID_S, COUNTRY_ID_S, SEARCH_AS_S, STATE_S) values ('qwer', 'qwer', 'qwer', 'qer')
13.10.2005 08:57:39 org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at oracle.jdbc.driver.OracleResultSetMetaData.<init>(OracleResultSetMetaData.java:89)
at oracle.jdbc.driver.ScrollableResultSet.getMetaData(ScrollableResultSet.java:1776)
at org.apache.jsp.insertForm_jsp._jspService(org.apache.jsp.insertForm_jsp:157)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)

Bisschen Code:
Query.java
Code:
public class Query 
{
    public ResultSet resSet;
    private boolean error = false;
    private String strE = "";    
    private int intE;
    
    public Query(OraConnection oc, String query)
    {	
    	try
        {
            resSet = oc.stmt.executeQuery(query);
        }
        catch(SQLException e)
        {
            error = true;
            strE = e.toString();
            intE = e.getErrorCode();
            return;
        }
    }
    public boolean isError()
    {
        return error;
    }
    public String getError()
    {
        return strE;
    }    
    public int getErrorNr()
    {
        return intE;
    }
}

insertForm.jsp:
Code:
<%
	////  Form viewing      ////	
	//Getting parameters
	String strTable = request.getParameter("table");
	String strSubmit = request.getParameter("hSubmit");
	
	//Getting connection and execute query
	OraConnection oc = new OraConnection(application.getInitParameter("jdbcUrl"));
	Query qryField = new Query(oc, "SELECT * FROM " + strTable);
	System.out.println("SELECT * FROM " + strTable);
	qryField.resSet.next();

	//Creating vars for later use
	int iColumnCount = qryField.resSet.getMetaData().getColumnCount();
	
	System.out.println("ResSet" + qryField.resSet.getMetaData().getColumnCount());
	
	////  Insert procedure  ////
	if(strSubmit != null)
	{
		//Vars
		StringBuilder sbSql = new StringBuilder();
		Vector vecFields = new Vector();
		String strField = null;
		String strError = "<font color='green'>Record successfully inserted</font>";
		
		//Get all fields
		Enumeration enuFields = request.getParameterNames();
		
		//Go through all elements and build sql statement
		sbSql.append("INSERT INTO " + strTable + " (");
		//Add all fields
		while(enuFields.hasMoreElements())
		{
			strField = enuFields.nextElement().toString();
			if(!strField.equals("table") &&
			   !strField.equals("hSubmit"))
			{
				sbSql.append(strField + ", ");
				vecFields.addElement(strField);
			}
		}
		//Cut last two characters and add next sql part
		sbSql.delete(sbSql.length()-2, sbSql.length());
		sbSql.append(") values (");
		for(int i = 0; i < vecFields.size(); i++)
		{
			sbSql.append("'" + request.getParameter(vecFields.get(i).toString()) + "', ");
		}
		//Cut last 2 characters and finish sql statement
		sbSql.delete(sbSql.length()-2, sbSql.length());
		sbSql.append(")");

		//Execute query
		System.out.println(sbSql.toString());
		Query qryInsert = new Query(oc, sbSql.toString());
		//Check for errors
		if(qryInsert.isError())
		{
			strError = "<font color='red'>" + qryInsert.getErrorNr() + "</font>";
			System.out.println("error");
		}
	}
%>
 

Bleiglanz

Gesperrter Benutzer
Code:
    public ResultSet resSet;
    private boolean error = false;
    private String strE = "";   
    private int intE;
   
    public Query(OraConnection oc, String query)
    {   
       try
        {
            resSet = oc.stmt.executeQuery(query);
        }
        catch(SQLException e)
        {
            error = true;
            strE = e.toString();
            intE = e.getErrorCode();
            return;
        }
    }
da seh ich mehrere fehler auf einmal

a) hat das oc eine member-Variable stmt? schlecht

b) und wenn, dann mit getter/setter arbeiten

c) hat Query das ResultSet als member? schlecht

d) lieber die SQL-Ex weiterwerfen, wozu verschlucken??

e) wo in deinem Code sollen denn jemals die close() kommen?

f) Trennung Code/Layout: solange scripts in jsp's sind schlecht

der Fehler ist ganz unten:

//Execute query
System.out.println(sbSql.toString());
Query qryInsert = new Query(oc, sbSql.toString());

du willst nochmal eine neue Query machen, mit dem gleichen stmt, hast aber das erste resultset nicht geschlossen und ein INSERT kann man doch nicht mit executeQuery absetzen...
 

Mag1c

Top Contributor
Hi,

erzeugst du irgendwo auch ein Statement ?

Edit: moin Bleiglanz:
sehr ausführlich, fein ;)

Gruß
Mag1c
 

Sanix

Top Contributor
Bleiglanz hat gesagt.:
da seh ich mehrere fehler auf einmal

a) hat das oc eine member-Variable stmt? schlecht

b) und wenn, dann mit getter/setter arbeiten

c) hat Query das ResultSet als member? schlecht

d) lieber die SQL-Ex weiterwerfen, wozu verschlucken??

e) wo in deinem Code sollen denn jemals die close() kommen?

f) Trennung Code/Layout: solange scripts in jsp's sind schlecht

der Fehler ist ganz unten:

//Execute query
System.out.println(sbSql.toString());
Query qryInsert = new Query(oc, sbSql.toString());

du willst nochmal eine neue Query machen, mit dem gleichen stmt, hast aber das erste resultset nicht geschlossen und ein INSERT kann man doch nicht mit executeQuery absetzen...

Erstmals vielen Dank, ich muss das ganze wohl nochmals überarbeiten.
Habe aber noch ein paar Fragen:
Zu a-c) Anstatt als Member das ganze also private definieren und per getResultSet etc. Das ist aber immer noch nicht gerade gut, wenn ich es richtig verstanden haben, wieso?
Zu d) Die Exception habe ich verschluckt, dass ich sie nicht noch einmal extra handlen muss.
Zu e) Das close kommt weiter unten.
Zu f) Du würdest den ganzen Code in eine Klasse packen, nehme ich an. Wie sollte die so etwa aussehen?

Klasse Locations
getColumns() - String array - Mit allen Spalten?
insertData(String[] feldDaten)

Verkompliziere ich das Ganze, dadurch nicht?
 

Bleiglanz

Gesperrter Benutzer
die ganze Idee

"Resultset" oder "Statement" in Membervariablen "abspeichern" ist ziemlich fragwürdig, der ganze DBCode sollte in einer Methode

Code:
public ReturnTyp meinefunktion(Connection c){
     // statement erzeugen - nur lokale Blocklevel Variable
     // resultset erzeugen - nur lokale Blocklevel Variable
     // while(rs.next() 
     // was machen
     // alles closen in finally
     // return irgendwas, z.B. einen erarbeiteten String
}

ablaufen, das ist erstmal am einfachsten

das Problem ist, dass ResultSet und Statement ohne die geöffnete Connection nicht lebensfähig sind, und wenn man die so herumreicht kann das schief gehen (hast du ja schon gemerkt)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M doGet()-Methode wird nicht geladen Allgemeines EE 3
B Datenbank Resource wird nicht gefunden Allgemeines EE 1
OnDemand JSF Stacktrace wird nicht korrekt ausgegeben Allgemeines EE 1
J Mit @Schedule annotierte Methode wird nach einer Weile nicht mehr ausgeführt (JBoss AS 7.2) Allgemeines EE 0
S Drools - Stop sobald erste Regel getroffen wird Allgemeines EE 2
S a4j:ajax Event wird 2 Mal gefeuert. Allgemeines EE 0
J JBoss, Eclipse, Webseite wird nicht angezeigt? Allgemeines EE 4
Y JSF EJB wird nicht injected Allgemeines EE 18
A Wie kann ich verhinder, dass die seite angezeigt wird? Allgemeines EE 3
P Prozess wird nicht beendet Allgemeines EE 4
C JSP wird nur halb geladen Allgemeines EE 2
G jsp:getProperty wird mehrfach aufgerufen - Warum? Allgemeines EE 3
A action-Methode wird nicht aufgerufen Allgemeines EE 7
M taglib wird nicht gefunden Allgemeines EE 9
N JSF + Facelets: Datatable wird nicht angezeigt Allgemeines EE 1
G EJB - EJB wird nicht ins Servlet geladen Allgemeines EE 3
F doFilter wird zwei mal aufgerufen Allgemeines EE 5
M Action wird 2 mal durchlaufen Allgemeines EE 3
P JSF Seite wird nicht gestartet Allgemeines EE 4
B FileInputStream(sPath); file wird nicht gefunden Allgemeines EE 5
F MyFaces und Tiles: <tiles:insert> wird nicht erkannt Allgemeines EE 10
A HttpUnit: Form wird nicht submitted Allgemeines EE 4
G welcher Appserver wird verwendet Allgemeines EE 4
S package wird nicht gefunden Allgemeines EE 2
H Servlet: init() wird 2x ausgeführt Allgemeines EE 8
E Tomcat/Servlet Problem - Servlet wird nicht gefunden Allgemeines EE 8
G properties file im J2EE Server - wo wird genau gesucht? Allgemeines EE 6
F Servlet: DoPost wird zweimal aufgerufen Allgemeines EE 3
M Servlet: CSS der JSP wird bei einem forward nicht gefunden? Allgemeines EE 2
D HTML-Code von JSP wird in Browser nicht angezeigt?! Allgemeines EE 3

Ähnliche Java Themen


Oben