# Problem mit Treiber? insert into Befehl geht nicht



## christian8287 (3. Mai 2005)

Hallo!

Mein Problem ist es, so glaube ich, dass mir ein Treiber fehlt (vielleicht JDBC ODBC Bridge??).
Die Ausgabe meines Programmes sieht folgendermaßen aus:


C:\Dokumente und Einstellungen\Christian\Test\src>java -cp . Labor_12
Treiber erfolgreich geladen
Verbindung erfolgreich aufgebaut
Statement erfolgreich erzeugt
sql> select * from test1
name : alter : beruf :
sql> insert into test1 values("Christian",18,"Schüler");
Fehler:
[Microsoft][ODBC Microsoft Access Driver] Fehlt
sql>

Ein Select geht komischerweise, aber bei einem insert fehlt irgendwas. Ich weiß aber nicht was, normal sollte das Programm schon funktionieren. Kann es sein, dass mir eine JDBC ODBC Bridge fehlt, wenn ja, wo kann man die herbekommen? Ich müsste das Programm, nämlich nochmal testen, weil ich morgen das für die Schule brauche. Hier noch mal der Code, falls der für mein Problem wichtig ist:


```
import java.sql.*;
import java.io.*;
import java.util.*;

public class Labor_12 {

  public static void main(String []args) 	{
    Connection con = null;
    try {
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     System.out.println("Treiber erfolgreich geladen");
    }
    catch(ClassNotFoundException e) {
     System.err.println("Fehler: " + e);
     System.exit(0);
    }

    try {
      con = DriverManager.getConnection("jdbc:odbc:Test","","");
      con.setAutoCommit(false);
      System.out.println("Verbindung erfolgreich aufgebaut");
    }
    catch(SQLException e) {
      System.err.println("Fehler: " + e.getMessage()); 
      System.exit(0);
    }

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    Statement s = null;
    try {
      s = con.createStatement();
      System.out.println("Statement erfolgreich erzeugt");
    }
    catch(SQLException e) {
      System.err.println("Fehler: " + e.getMessage());
      System.exit(1);
    }

    try {
      boolean alt=false;
      int i=0;
      String[] st = new String[0];
      String line = null;
      System.out.print("sql> ");
      System.out.flush();
      line = in.readLine();
      outer: if(line.startsWith("-s")) {
          if((st = readTXT(line))==null)
              break outer;
          for(i=0;i<st.length;i++) 
              x(st[i],s);
          if(i==(st.length-1))
            con.commit(); 
          else
              con.rollback();
          alt=true;
      }
      while(!line.equals("quit")) {
        if(alt==false) {
            x(line,s);
            con.commit();
        }
        System.out.print("sql> ");
        System.out.flush();
        alt=false;
        line = in.readLine();
        outer: if(line.startsWith("-s")) {
          if((st = readTXT(line))==null)
              break outer;
          for(i=0;i<st.length;i++)
              x(st[i],s);
          if(i==(st.length-1))
              con.commit();
          else
              con.rollback();
          alt=true;
        }
      }
    }
    catch(SQLException sqle) {}
    catch(IOException ioe) {}

    try {
      con.close();
      System.out.println("Verbindung erfolgreich aufgeloest");
    }
    catch(SQLException e) {
      System.err.println("Fehler: " + e);
    }
  }

  public static void x(String line, Statement s) {
          try {
          if(s.execute(line)) {  // Abfrage durchgeführt
            ResultSet rs = s.getResultSet();
            printRecords(rs);
          }
          else {
            int nr = s.getUpdateCount();
            System.out.println(nr + " Datensätze erfolgreich aktualisiert");
          }
        }
        catch(SQLException e) {
          System.out.println("Fehler:\n" + e.getMessage() );
        }

  }
  
  public static void printRecords(ResultSet rs) throws SQLException {
    ResultSetMetaData rsmd = rs.getMetaData();
    StringBuffer header = new StringBuffer();
    for (int i = 1; i <= rsmd.getColumnCount(); i++) 
      header.append(rsmd.getColumnName(i) + " : ");
      System.out.println(header);
      StringBuffer line;
      while(rs.next()) {
        line = new StringBuffer();	
        for (int i = 1; i <= rsmd.getColumnCount(); i++) { 
          switch(rsmd.getColumnType(i)) {
            case Types.INTEGER: line.append(rs.getInt(i) + " : ");
	                        break;
            case Types.DOUBLE:  line.append(rs.getDouble(i) + " : ");
                                break;
            case Types.VARCHAR: line.append(rs.getString(i) + " : ");
		                break;                     
            default:            line.append(rs.getString(i)+ " : ");
			        break;
          }
        }
    System.out.println(line);
    }
  }
  private static String[] readTXT(String line) {
      StringBuffer sb = new StringBuffer();
      try {
          BufferedReader br = new BufferedReader(new FileReader(line.substring(3)));
          String help;
          while((help=(br.readLine()))!=null) {
            if(!help.equals(null))
                sb.append(help);
          }
      }
      catch(FileNotFoundException fnfe) {
          System.out.println("Datei nicht vorhanden.");
          return null;
      }
      catch(IOException e) {}
      StringTokenizer st = new StringTokenizer(new String(sb),";");
      String[] s = new String[st.countTokens()];
      for(int i=0;i<s.length;i++) 
          s[i] = (String)st.nextElement()+";";
      return s;
  }
}
```



Danke schon mal!!

mfg,
Christian.


----------



## DP (3. Mai 2005)

gib mal den ganzen stacktrace aus (e.printstacktrace()) anstatt getmessage


----------



## christian8287 (3. Mai 2005)

Er gibt folgendes aus:


C:\Dokumente und Einstellungen\Christian\Test\src>java -cp . Labor_12
Treiber erfolgreich geladen
Verbindung erfolgreich aufgebaut
Statement erfolgreich erzeugt
sql> select * from test1
name : alter : beruf :
sql> insert into test1 values("Christian",18,"Schüler");
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Fehlt
        at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
        at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
        at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3111)
        at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)
        at Labor_12.x(Labor_12.java:96)
        at Labor_12.main(Labor_12.java:62)
sql>

Was kann das sein? - in der Schule bekomme ich keine solche Fehlermeldung.

Danke schon mal!

mfg,
Christian.


----------



## abollm (3. Mai 2005)

Wie ist denn die Tabelle genau aufgebaut -> Spalten?

Du verwendest in der Schule die gleiche INSERT-Anweisung?


----------



## christian8287 (4. Mai 2005)

ja alles das gleiche. Die Tabelle ist immer anders aufgebaut. Es darf für dieses programm kein problem sein, welche spalten und wie viele spalten drinnen sind. Die syntax der insert into anweisung war komplett richtig.

Ich hab das programm eh schon abgegeben. in der schule hat es funktioniert. Aber wir bekommen auch noch eine richtige hausübung auf zu diesem thema und da wäre es super, wenn ich es auch zu hause testen könnte.

Vielleicht hat ja noch wer eine idee was das problem sein könnte.

Danke auf jeden Fall!

mfg,
Christian.


----------



## Bleiglanz (4. Mai 2005)

verwende mal einfache hochkommas ' 

stimmen die typen?

ist name ein char
alter ein int
beruf ein char


----------

