# Probleme mit INSERT Befehl



## shitake83 (5. Nov 2010)

Hi Leute,

ich möchte einen INSERT machen aber ich weiss nicht wieso er die DB nicht updated bzw. den INSERT nicht durchführt.
Habe gedebugged und alle Werte die für den INSERT wichtig sind,sind vorhanden. Es kann also nur an meiner Insert Geschichte liegen

Das is das Statement was nicht funktioniert (einfach mal mit dummy daten;hat aber nicht geklappt):

```
stamt.addBatch("INSERT INTO bs_verz_gc VALUES (1,2,3,4,5,6,7,8,9,10)");
```

Normalerweise sollte ich doch jetzt eine extra Zeile in der Tabelle bs_verz_gc haben oder ?? Hab ich aber net ;(


bzw. hier das "echte" Statement:


```
String sql = "INSERT INTO bs_verz_gc " 
    		  + "(bs_nr,kv,plz,ort,strasse,lat,lng,loaddate,gcdate,flag)" 
    		  + "VALUES('" + dbSet[0] +"','" + dbSet[1] +"','" + dbSet[2] +"','" + dbSet[3] +"','" + dbSet[4] +"','" + dbSet[5] +"','" + dbSet[6] +"','" + dbSet[7] +"','" + dbSet[8] +"','" + dbSet[9] +"');";

stamt.addBatch(sql);
```


Hier nochmal der Code von meinem gesamten Programm 
p.s.: kommentare die euch verwirren ignorieren, es sind wahrscheinlich alte oder welche die schon weg sind^^


```
import java.sql.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.Date;

//Das split[2] & [3] müssen aus der Methode bei jeder Abfrage rausgeechot und iwie gespeichert werden.
//um dann mit der setGeoToDB in die DB gespeichert zu werden.

/**
 * Diese Klasse stellt eine JDBC Verbindung zu einer PostgreSQL DB her,
 * holt sich PLZ Daten, schickt sie gegen GoogleMaps
 * und erhält als Ergebnis, Latitude und Longitude der PLZ,
 * die wiederum in die Datenbank zurückgespeichert wird
 *
 * @author      
 * @version     1.0 November 2010                                
 *                                  
 */

public class DbConnect {


 /**
     * Stellt die Datenbank Verbindung her
     *
     * @param e Exception Handler
     * @param connection JDBC Connection Handler
     * @param url JDBC Connection URL
     * @param stmt SQL Statement
     * @param rs SQL Statement -> Result
     *
     */

      public static void DbConn() throws Exception{
                   
          try {
            Class.forName("org.postgresql.Driver");
     
          } catch (ClassNotFoundException e) {
            System.out.println("Hasse keinen JDBC Treiber? Hau den ma in deinen library path!");
            e.printStackTrace();
            return;
          }
     //Meldung das der Treiber geht
     
          Connection connection = null;
     
          try {

             String url = "jdbc:postgresql://server:port/datenbank";
             
             connection = DriverManager.getConnection(url,"postgres", "postgres");
     
             Statement stmt = connection.createStatement();
             ResultSet rs;
            
             rs = stmt.executeQuery("SELECT * FROM test LIMIT 10");
            
             while ( rs.next() ) {
             
                 String bs_nr = rs.getString("bs_nr");
                 String kv = rs.getString("kv");
                 String plz = rs.getString("plz");
                 String ort = rs.getString("ort");
                 String strasse = rs.getString("strasse");
                 String lat = "0";
                 String lng = "0";
                 
                 String loaddate = String.valueOf(System.currentTimeMillis());

                 
                 String gcdate = String.valueOf(System.currentTimeMillis());
                 String flag = "0";
                 
                 
                 String[] dbSet = {bs_nr,kv,plz,ort,strasse,lat,lng,loaddate,gcdate,flag};

                 printUrlContent("http://maps.google.com/maps/geo?q=" + plz + "&output=csv",dbSet);                   
             }
             connection.close();
     
          } catch (SQLException e) {
            System.out.println("Connection Failed! Check output console");
            e.printStackTrace();
            return;
          }
     
          if (connection != null)
              System.out.println("Endlich feddich!!!");
          else
                  System.out.println("Keine Verbindung am stizzen!");
          }
   
    /**
     * Holt die CSV von GoogleMaps
     *
     * @param urlString Die auszugebende URL
     * @param dbSet Datensatz als Array aus der DB
     *      
     * @param con URLConnection Handle
     * @param reader buffered reader
     * @param line Aktuelle Reihe der Abfrage
     *
     */   
     
      public static void printUrlContent(String urlString, String[] dbSet) throws Exception {
             URLConnection con = new URL(urlString).openConnection();
             con.connect();
             BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
             String line = null;
            
             while ((line = reader.readLine()) != null) {
               
                 final String[] split = line.split(",");
                 
                 //Ausgabe der lat/lng werte
                 
                 //check ob dbSet ankommt
                 
                 dbSet[5] = split[2];	//lat ins DB Array laden
                 dbSet[6] = split[3];	//lng ins DB Array laden
                 
                 System.out.println(dbSet[5] +" Testzeile" + "\n");
                 
                 //lat
                 System.out.println(split[2] + "Test:Lat");
                 
                 //lng
                 System.out.println(split[3] + "Test:Lng");
                 //nochmal ausgabe der line
                 System.out.println(line + "Test: Komplette Line");
    
                 //dbSet[0-7] oder was auch immer an die db schicken
                 setDataToDB(dbSet); //alt
                 //setDataToDB(dbSet); //neu
                                                                           
             }                     
       }
         
           
      //Lat/Lng in die DB schreiben
public static void setDataToDB(String[] dbSet){
      
      
       Connection connection = null;
       String url = "jdbc:postgresql://server:port/datenbank";
             
       try {
		connection = DriverManager.getConnection(url,"user", "passwort");
	} catch (SQLException e1) {
		// TODO Auto-generated catch block
		e1.printStackTrace();
	}
       
        //Statement stamt = connection.createStatement();
       //ResultSet rst;
       Statement stamt = null;
    try {
    
      stamt = connection.createStatement();

      /*String sql = "INSERT INTO bs_verz_gc " 
    		  + "(bs_nr,kv,plz,ort,strasse,lat,lng,loaddate,gcdate,flag)" 
    		  + "VALUES('" + dbSet[0] +"','" + dbSet[1] +"','" + dbSet[2] +"','" + dbSet[3] +"','" + dbSet[4] +"','" + dbSet[5] +"','" + dbSet[6] +"','" + dbSet[7] +"','" + dbSet[8] +"','" + dbSet[9] +"');";
      
      */
      stamt.addBatch("INSERT INTO bs_verz_gc VALUES (1,2,3,4,5,6,7,8,9,10) where bs_nr =1");
  
    		      

      connection.close();           
} catch (SQLException e) {
    System.out.println("Connection Failed! Check output console");
    e.printStackTrace();
    return;
  }
}
    
       
  public static void main(String[] argv) throws Exception{
     
     
      //PROXY SETTINGS : Damit Google die Daten zurückschickt
      //                 MUSS!! eingestellt sein, da sonst timeout
      Properties properties = System.getProperties();
      properties.put("http.proxyHost", "xxx.xxx.xxx.xxx");
      properties.put("http.proxyPort", "8080");
     

      //printUrlContent("http://maps.google.com/maps/geo?q=5310&output=csv");
      DbConn();          
     
  }  
  
 }
```


----------



## XHelp (5. Nov 2010)

Auszug aus der API:


> addBatch
> Adds the given SQL command to the current list of commmands for this Statement object. *The commands in this list can be executed as a batch by calling the method executeBatch.*



Ansonsten gibt es noch executeUpdate...


----------



## preachie (5. Nov 2010)

Ich kenne mich jetzt nicht mit Postgres aus, aber ich vermute mal, dort ist es so wie in anderen DBMS, dass die Datentypen schon stimmen müssen.

In Deinem Dummy Statement übergibst Du alle Werte als int, in dem "echten" Statement alle als String.
Ich vermute mal, dass die Spalten in Deiner Tabelle schon unterschiedliche Datentypen haben, oder?

Du solltest in einem DB Tool mal rumprobieren, was für ein Statement denn auch tatsächlich erfolgreich ausgeführt wird, entsprechend unter Berücksichtigung der verwendeten Datentypen.


----------



## shitake83 (5. Nov 2010)

Danke für die schnellen Antworten.

Ja ich hab verschiedene Datentypen in der DB und ja ich weiss das ich einmal int und einmal String hab, war nur zu test zwecken ob überhaupt irgendwie, irgendwas geht.

So ich hab auch mal rumprobiert und rausgefunden was xHelp gesagt hat : den executeBatch befehl. Wenn ich den jetzt aber quasi druntermache, kriege ich folgendes:


```
java.sql.BatchUpdateException: Batch entry 0 INSERT INTO bs_verz_gc VALUES (1,2,3,4,5,6,7,8,9,10) was aborted.  Call getNextException to see the cause.
	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2569)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1796)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2708)
	at DbConnect.setDataToDB(DbConnect.java:176)
	at DbConnect.printUrlContent(DbConnect.java:141)
	at DbConnect.DbConn(DbConnect.java:85)
	at DbConnect.main(DbConnect.java:202)
```

@preachie: ja ich werde mal ein paar statements direkt an der DB austesten.


----------



## XHelp (5. Nov 2010)

Wie gesagt, versuch es mal mit 
	
	
	
	





```
executeUpdate
```


----------



## Michael... (5. Nov 2010)

Da ja an vielen Stellen etwas anderes als Zahlen erwartet wird, kann Dein DummyStatement schon mal gar nicht funktionieren.

Verwende PreparadStatements, dann tust Du die leichter mit den unterschiedlichen Datentypen.


----------



## shitake83 (5. Nov 2010)

XHelp hat gesagt.:


> Wie gesagt, versuch es mal mit
> 
> 
> 
> ...



Wie du siehst habe ichs eingefügt und kriege diese Exception.



shitake83 hat gesagt.:


> Danke für die schnellen Antworten.
> 
> Ja ich hab verschiedene Datentypen in der DB und ja ich weiss das ich einmal int und einmal String hab, war nur zu test zwecken ob überhaupt irgendwie, irgendwas geht.
> 
> ...



habe meine Werte so geändert das sie von der Syntax her stimmen jetzt (im DB Tool getestet.)
Die Exception bleibt die gleiche nur das mein Insert argument ein anderes ist. Was kann also der Fehler sein??
Danke das ihr so schnell seid


----------



## preachie (5. Nov 2010)

In der Exception steht doch



> Call getNextException to see the cause.



Darüber sollte man doch mehr Infos bekommen, wieso der Vorgang gescheitert ist?!
Wie gesagt, kenne mich weder mit Postgres noch der API aus, aber sollte doch kein Hexenwerk sein


----------



## Michael... (5. Nov 2010)

Lass Dir das Insert Statement mal per System.out ausgeben
- wenn Du darin keinen Fehler entdeckst, kopiere es (1:1) und führe es in Deinem Datenbanktool aus
- wenn es da geht, liegt's vermutlich nicht am Statement ;-)


----------



## shitake83 (5. Nov 2010)

preachie hat gesagt.:


> In der Exception steht doch
> 
> 
> 
> ...




Irgendwie ist das verzwickt mit der nextEception weil da irgendwie nichts drin ist. Und ja Hexenwerk ist es nicht, aber du kennst ja unsere Halbleiterkollegen, die machen eh was sie wollen.



Michael... hat gesagt.:


> Lass Dir das Insert Statement mal per System.out ausgeben
> - wenn Du darin keinen Fehler entdeckst, kopiere es (1:1) und führe es in Deinem Datenbanktool aus
> - wenn es da geht, liegt's vermutlich nicht am Statement ;-)



Guter Ansatz, danke. Aber ich hab jetzt auch Feierabend und werd wohl nach Hause gehen. Setz mich aber bestimmt morgen nochmal dran, das lässt mich nicht los. Mein Programm wäre fertig wenn nicht dieses beschi**ene INSERT wäre 

Dank euch Leute.
Schönes WE.


----------



## Gast2 (5. Nov 2010)

Ich schätze mal das du beim insert die Datentypen falsch hast - probier es doch mal mit einem PreparedStatement... Sollte man sowieso vorziehen...


----------



## shitake83 (9. Nov 2010)

Ich hatte Syntax & Denk Fehler und meine finale funktionierende Lösung ist:

```
String sql = "INSERT INTO bs_verz_gc "
          + "(bs_nr,kv,plz,ort,strasse,lat,lng,loaddate,gcdate,flag)"
          + "VALUES('" + dbSet[0] +"','" + dbSet[1] +"','" + dbSet[2] +"','" + dbSet[3] +"','" + dbSet[4] +"','" + dbSet[5] +"','" + dbSet[6] +"','" + dbSet[7] +"','" + dbSet[8] +"','" + dbSet[9] +"')";
```

Danke für eure Hilfe.


----------

