2009-02-25 14 views
6

Warum wird dieses Programm nicht ausgeführt, wenn es zum zweiten Mal in die do while-Schleife geht und warum es die Ausnahme gibt "Exception java.sql.SQLException: [MySQL] [ODBC 5.1 Driver] [mysqld-5.0.51a-community -nt] Keine Datenbank ausgewählt "Warum 'Keine Datenbank ausgewählt' SQLException?

//import java.io.InputStream; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Scanner; 
import java.util.Vector; 

public class DataBase { 

    public void LoadDriver() { 

     // Load the JDBC-ODBC bridge driver 
     try { 
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
     } catch (ClassNotFoundException ee) { 
      ee.printStackTrace(); 
     } 
    } 

    // 2.open a data source name by means of the jdbcodbcdriver. 

    static void connect() throws SQLException { 

     // Connect to the database 
     Connection con = DriverManager.getConnection("jdbc:odbc:MySQL", "root", "admin"); 
     Statement stmt = con.createStatement(); 
     // Shut off autocommit 
     con.setAutoCommit(false); 


     System.out.println("1.Insert 2.Delete 3.Update 4.Select"); 
     Scanner s = new Scanner(System.in); 
     int x; 
     x = s.nextInt(); 

     String query; // SQL select string 
     ResultSet rs; // SQL query results 
     boolean more; // "more rows found" switch 
     String v1, v2; // Temporary storage results 

     Vector<Object> results = new Vector<Object>(10); 


     if (x == 1) { 

      try { 
       stmt.executeUpdate("INSERT INTO employee(emp_id,emp_name) VALUES ('122','shiva') "); 
      } catch(Exception e){System.out.println("Exception " +e);e.printStackTrace();} 
     } 

     if (x == 2) { 

      try { 
       stmt.executeUpdate("DELETE from employee where emp_id='102' "); 
      }catch(Exception e){System.out.println("Exception "+e);e.printStackTrace();} 
     } 

     if (x == 3) { 

      try { 
       stmt 
         .executeUpdate("UPDATE employee SET emp_name = 'madavan' where emp_id='20'; "); 
      } catch(Exception e){System.out.println("Exception "+e);e.printStackTrace();} 
     } 


     query = "SELECT * FROM employee "; 
     try { 
      rs = stmt.executeQuery(query); 
      // Check to see if any rows were read 
      more = rs.next(); 
      if (!more) { 

       System.out.println("No rows found."); 
       return; 
      } 

      // Loop through the rows retrieved from the query 
      while (more) { 

       v1 = "ID: " + rs.getInt("emp_id"); 
       v2 = "Name: " + rs.getString("emp_name"); 

       System.out.println(v1); 
       System.out.println(v2); 
       System.out.println(""); 

       results.addElement(v1 + "\n" + v2 + "\n"); 

       more = rs.next(); 
      } 
      rs.close(); 

     } catch (SQLException e) { 
      System.out.println("" + results.size() + "results where found."); 
     } 
     finally{stmt.close();} 
    } 

    public static void main(String[] args) throws SQLException { 
     String str = "y"; 
     do { 
      DataBase s = new DataBase(); 
      s.LoadDriver(); 
      DataBase.connect(); 
     Scanner sc = new Scanner(System.in); 
     System.out.println("DO u Want to PROCEED TO QUERY : "); 
     str = sc.next(); 
     } while (str !="n"); 
    } 

} 

Antwort

2

Nur von der Ausnahme betrachten .. Ich würde vermuten, dass Sie nicht die Datenbank angeben. Wie können Sie eine Auswahl in einer Tabelle vornehmen, ohne anzugeben, welches Schema ausgewählt werden soll? Dies wird normalerweise in der Verbindungszeichenfolge festgelegt.

+0

ich seine enthalten ist, unter Verwendung von JdbcOdbcDriver da in der ODBC-Definition vermuten würde – toad

+0

Interessante .. der Schemaname ist MySql ?? – markt

+0

Das wäre der Name einer ODBC-Definition auf ihrem Computer – toad

6

Wenn Sie nicht den JDBC/ODBC-Treiber verwenden müssen, würde ich den direkten mysql JDBC-Treiber verwenden. Sie können es kostenlos von MySQL herunterladen.

dann

public void LoadDriver() { 

     // Load the JDBC-ODBC bridge driver 
     try { 
       Class.forName("com.mysql.jdbc.Driver"); 
     } catch (ClassNotFoundException ee) { 
       ee.printStackTrace(); 
     } 
} 

static void connect() throws SQLException { 

     // Connect to the database 
     Connection con = DriverManager.getConnection("jdbc:mysql:host/databasename", "root", "admin"); 
     Statement stmt = con.createStatement(); 
... 
0

ein bug listing at MySQL gefunden, die diesen Fehler, aber mit unterschiedlichen Technologien gibt. In der Beschreibung wird jedoch darauf hingewiesen, dass es sich um eine Reauthorization handelt, bei der die Datenbankinformationen nicht gesendet werden. Dies ist möglicherweise auch der Fall, auf den Sie hier stoßen.

Einige Dinge, die als seltsam für mich herausstehen (obwohl keine Ahnung, ob sie irgendwelche Auswirkungen auf Ihre Fehler haben)

  • Sie müssen nur den Treiber-Manager einmal
  • Sie schließen nicht laden Ihre Verbindung, also schließen Sie sie oder refactor, um das gleiche zu verwenden.

Vielleicht diese beiden Linien bewegen, um kurz vor der do Schleife

DataBase s = new DataBase(); 
s.LoadDriver(); 
1

Ist die ODBC-Quelle eine Datenbank auszuwählen tatsächlich einrichten? z.B. Können Sie über ein anderes ODBC-Client-Tool auf die Datenbank zugreifen?

Wenn Sie eine Datenbank explizit in der JDBC-Zeichenfolge auswählen müssen, können Sie dies mit dem Parameter 'database' tun.

Aber die Datenbank in der ODBC-Setup gewählt wäre mehr üblich. Und tatsächlich, wie Clint erwähnte, wäre die Verwendung des normalen MySQL-JDBC-Treibers anstelle von ODBC noch üblicher.

während (str! = "N")

That's not how you compare strings in Java.

Verwandte Themen