# ResSet wird "vernichtet"



## Sanix (13. Okt 2005)

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:

```
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
> ...



Bisschen Code:
Query.java

```
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:

```
<%
	////  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 (13. Okt 2005)

```
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 (13. Okt 2005)

Hi,

erzeugst du irgendwo auch ein Statement ?

Edit: moin Bleiglanz:
sehr ausführlich, fein 

Gruß
Mag1c


----------



## Sanix (13. Okt 2005)

Bleiglanz hat gesagt.:
			
		

> da seh ich mehrere fehler auf einmal
> 
> a) hat das oc eine member-Variable stmt? schlecht
> 
> ...



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 (13. Okt 2005)

die ganze Idee

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


```
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)


----------



## Sanix (17. Okt 2005)

Stimmt du hast recht, danke , muss wohl alles ändern.


----------

