# Probleme mit Datensätzen in MySql DB



## robb (20. Feb 2007)

Hi,

ich habe ein komisches Problem, dass mir nicht so ganz einleuchten will. Ich habe für einen Handyberater eine Datenbank angelegt mit vielen verschiedenen Informationen zu Handys. Durch ein paarmal Debuggen des Codes habe ich auch Änderungen an den Namen der Hersteller und Modelle in der Datenbank vorgenommen. Seitdem kann ich die Handys, wo der Hersteller geändert wurde, nicht mehr identifizieren. 

Ein weiteres Problem ist auch, dass ich die Datenbank in der letzten Woche erweitert habe um ca 100 Handys. Nur wird mir immer nur die alte Anzahl der Handys ausgegeben.
Ich teste die gesamte Application im Moment unter Tomcat 5.5.17 und habe eine Applet-Servlet Kommunikation für die Datenbankabfrage realisiert. 

mfg Robb


----------



## DP (20. Feb 2007)

poste mal etwas code wo du mit der db kommunizierst


----------



## robb (20. Feb 2007)

Erstmal das Servlet:


```
import java.io.*;

import javax.servlet.ServletException;
import javax.servlet.http.*;


public class HandyInfoServlet extends HttpServlet {
	
	
	/**
	 * Get a String-object from the applet and send it back.
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		
		HandySelection hs;
		BaseList handylist;
		try {
			response.setContentType("application/x-java-serialized-object");

			// read a String-object from applet
			// instead of a String-object, you can transmit any object, which
			// is known to the servlet and to the applet
			InputStream in = request.getInputStream();
			ObjectInputStream inputFromApplet = new ObjectInputStream(in);
			String[] str = (String[]) inputFromApplet.readObject();
			
			hs=new HandySelection(str);
			hs.openDbCon();
			hs.startEval();
			handylist=hs.getQueue();
			hs.closeDbCon();
			// echo it to the applet
			OutputStream outstr = response.getOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(outstr);
			oos.writeObject(handylist);
			oos.flush();
			oos.close();
		} catch (Exception e) {
			e.printStackTrace();
			fl.Log(Loggable.ERROR, "Error: "+e.toString());
		}
	}
	
}
```

Das Applet schickt ein String-Array an das Servlet und aus diesem String Array wird in der Klasse HandySelection das SQL-Statement erstellt und verarbeitet. Dazu nochmal die Kommunikation zur DB in der Klasse HandySelection:

```
(..)
/**
	 * Methode mit der die Handyinfo-Liste gefüllt wird
	 *
	 */	
	private void fillHandyList() throws Exception{
		BaseList mid=new EmptyList();
		BaseList did=new EmptyList();
		BaseList fid=new EmptyList();
		BaseList tid=new EmptyList();
		BaseList final_mids=new EmptyList();
				
		con.openConnection();
		
		Statement sm=con.getStatement();
		ResultSet rs=sm.executeQuery(select_mid);
		//Model IDs ermitteln
		while (rs.next()){
			if (mid.isEmpty()){
				mid=mid.makeStack(rs.getInt("MID"));
			}
			else mid=mid.insert((Object)rs.getInt("MID"));
		}
		rs.close();
		//Technische Daten IDs ermitteln
		rs=sm.executeQuery(select_tid);
		while (rs.next()){
			if (tid.isEmpty()){
				tid=tid.makeStack((Object)rs.getInt("TID"));
			}
			else tid=tid.insert((Object)rs.getInt("TID"));
		}
		rs.close();
		//Datenübertragungs IDs ermitteln
		rs=sm.executeQuery(select_did);
		while (rs.next()){
			if (did.isEmpty()){
				did=did.makeStack((Object)rs.getInt("DID"));
			}
			else did=did.insert((Object)rs.getInt("DID"));
		}
		rs.close();
		//Funktions IDs ermitteln
		rs=sm.executeQuery(select_fid);
		while (rs.next()){
			if (fid.isEmpty()){
				fid=fid.makeStack((Object)rs.getInt("FID"));
			}
			else fid=fid.insert((Object)rs.getInt("FID"));
		}
		rs.close();
		con.releaseStatement(sm);
		//--- Die wirklichen Handys ermitteln----
		sm=con.getStatement();
		int tmp;
		for (int i=1; i<=mid.length();i++){
			tmp=new Integer(mid.getObject(i).toString());
			rs=sm.executeQuery("select TID,FID,DID from MODELTYPE_HAS_EXTRAS where MID="+tmp);
			if (rs.next()){
				//Modell ID Liste aufbauen, wenn die Technische-Daten ID, Funktions ID und Datenkommunikations ID vorhanden ist
				if (tid.isIn(rs.getInt("TID"))&&fid.isIn(rs.getInt("FID"))&&did.isIn(rs.getInt("DID"))){
					if (final_mids.isEmpty()){
						final_mids=final_mids.makeQueue(mid.getObject(i));
					}
						else final_mids=final_mids.insert(mid.getObject(i));
				}
			}
			rs.close();
		}
		//--- Handyliste erstellen
		for (int i=1; i<=final_mids.length();i++){
			tmp=new Integer(final_mids.getObject(i).toString());
			rs=sm.executeQuery("SELECT * FROM MODELTYPE_HAS_EXTRAS me, MODELTYPE m, DATACOMUNICATION d, FUNCTION f, TECHNICALDATA t"+
							   " WHERE me.mid="+tmp+" AND m.mid="+tmp+" AND me.did=d.did AND me.fid=f.fid AND me.tid=t.tid ");//ORDER BY m.PRODUCER,m.MODEL");
			if (rs.next()){
				if (handyqueue.isEmpty()){
						handyqueue=handyqueue.makeStack(getHandyinfo(rs));
				}else handyqueue=handyqueue.insert(getHandyinfo(rs));
			}
		}
		rs.close();
		con.releaseStatement(sm);
	}
(...)
```

Die SQL Statements stehen in den select_mid, select_tid Strings....  Und letztendlich speicher ich die wirklich gefundenen Handys in einer Handyqueue ab, die auch wieder zurückgeschickt wird an das Applet.
Kann es vielleicht auch sein, das die Grösse der Liste ein Problem für den Stream ist?


----------



## robb (20. Feb 2007)

So ich hab den Fehler behoben, es war ein Problem mit dem Statement, das ich mir zusammengebaut habe.


----------

