0

接続クラス:

public class ConectaSiscart { 
        static Connection connection = null;
        Statement stm = null;
        static String serverName = "192.168.0.222";    //caminho do servidor do BD  
        static String mydatabase ="risabel";        //nome do seu banco de dados  
        static String url = "jdbc:mysql://" + serverName + "/" + mydatabase;  
        static String username = "siscart";        //nome de um usuário de seu BD        
        static String password = "progsis";      //sua senha de acesso  





        public static Connection getConexao() {
            try {  
                // Carregando o JDBC Driver padrão  
                Class.forName("com.mysql.jdbc.Driver");  
                // Configurando a nossa conexão com um banco de dados//  


                ResultSet results = null;
               // connection = DriverManager.getConnection("jdbc:mysql://192.168.0.222/risabel?user=siscart&password=progsis");
                connection = DriverManager.getConnection(url, username, password);  
                System.out.println("Connection é " + connection);
                return connection;  
            }  catch (ClassNotFoundException e) {  //Driver não encontrado  
                System.out.println("O driver especificado nao foi encontrado.");  
                return null;  
            } catch (SQLException e) {  
                //Não conseguindo se conectar ao banco  
                System.out.println("Nao foi possivel conectar ao Banco de Dados.");  
                e.printStackTrace();
                return null;  

            }
}  

}

接続を行うメソッド。このメソッドは、マウスの lostfocus イベントに関連付けられており、必要なデータベースからアイテムを返します。

private void puxaemailsiscart()  {
                ConectaSiscart puxaemail = new ConectaSiscart();
                Connection conectadomysql = ConectaSiscart.getConexao();
                String servico = null;
                    if(cboxservico.getSelectedItem() == "Registro de Imóveis") {
                    servico = "reg_cab";
                }
                Statement stm = null;
                ResultSet results = null;  
                 try {
                    stm = conectadomysql.createStatement ();
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }


                                try {
                    System.out.println();
                    results = stm.executeQuery ("SELECT * FROM  " + servico + " WHERE protocolo =" + tfProtocolo.getText());
                    if(results.next()) {

                    tfEmailParte.setText(results.getString("Email").toString());

                    } else { 
                        System.out.println("Protocolo nao encontrado");


                    }
                    results.close();
                    stm.close();






                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();

                } finally {
    System.out.println("Closing the connection.");
    if (conectadomysql != null) try { conectadomysql.close(); } catch (SQLException ignore) {}
}



            }
        });

しかし、何らかの理由で、2回目の試行で、org.mysqlをorg.sqlite.JDBCに変更します

java.sql.SQLException: 無効なデータベース アドレス: jdbc:mysql://192.168.0.222/risabel at org.sqlite.JDBC.createConnection(JDBC.java:110) at

org.sqlite.JDBC.connect(JDBC.java:87) で

java.sql.DriverManager.getConnection(未知のソース) で java.sql.DriverManager.getConnection(未知のソース) で ConectaSiscart.getConexao(ConectaSiscart.java:30) で telaprincipal$3.puxaemailsiscart(telaprincipal.java:359) で telaprincipal$3. java.awt.AWTEventMulticaster.focusLost(ソース不明) java.awt.Component.processFocusEvent(ソース不明) java.awt.Component.processEvent(ソース不明) java.awt.Container の focusLost(telaprincipal.java:350) java.awt.Component.dispatchEventImpl の .processEvent(不明なソース) java.awt.Container.dispatchEventImpl の(不明なソース) java.awt.Component.dispatchEvent の(不明なソース) java.awt.KeyboardFocusManager.redispatchEvent の(不明なソース) java.awt.DefaultKeyboardFocusManager.typeAheadAssertions で (不明なソース) java.awt.DefaultKeyboardFocusManager.typeAheadAssertions で。awt.DefaultKeyboardFocusManager.dispatchEvent(不明なソース) java.awt.Component.dispatchEventImpl で(不明なソース) java.awt.Container.dispatchEventImpl で(不明なソース) java.awt.Component.dispatchEvent(不明なソース) で java.awt. java.awt.EventQueue.access$200 の EventQueue.dispatchEventImpl (ソース不明) (ソース不明) java.awt.EventQueue$3.run (ソース不明) java.awt.EventQueue$3.run (ソース不明) java.security でjava.security.ProtectionDomain$1 の .AccessController.doPrivileged(ネイティブ メソッド).java.security.ProtectionDomain$1 の doIntersectionPrivilege(不明なソース) java.awt.EventQueue$4 の doIntersectionPrivilege(不明なソース) java.security.AccessController の awt.EventQueue$4.run(不明なソース)。java.security.ProtectionDomain$1 の doPrivileged (ネイティブ メソッド)。 (ソース不明) java.awt.EventDispatchThread.pumpEventsForHierarchy (ソース不明) java.awt.EventDispatchThread.pumpEvents (ソース不明) java.awt.EventDispatchThread.pumpEvents (ソース不明) java.awt.EventDispatchThread.run(不明)ソース) スレッド「AWT-EventQueue-0」での例外 java.lang.NullPointerException at telaprincipal$3.puxaemailsiscart(telaprincipal.java:367) at telaprincipal$3.focusLost(telaprincipal.java:350) at java.awt.AWTEventMulticaster.focusLost(ソース不明) java.awt.Component.processFocusEvent(不明なソース) java.awt.Component.processEvent(不明なソース) で java.awt.Container.processEvent(不明なソース) java.awt.Component.dispatchEventImpl(不明なソース) で java.awt.Container. java.awt.Component.dispatchEvent(不明なソース) で java.awt.KeyboardFocusManager.redispatchEvent(不明なソース) で java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(不明なソース) で java.awt.DefaultKeyboardFocusManager.dispatchEvent(ソース不明) java.awt.Component.dispatchEventImpl(ソース不明) java.awt.Container.dispatchEventImpl(ソース不明) java.awt.Component.dispatchEvent(ソース不明) java.awt.EventQueue.dispatchEventImpl(ソース不明) ) java.awt.EventQueue.access$200 (不明なソース) で java.java.security.AccessController.doPrivileged(ネイティブ メソッド) で java.awt.EventQueue$3.run(不明なソース) で awt.EventQueue$3.run(不明なソース) java.security.ProtectionDomain$1.doIntersectionPrivilege(不明なソース) で.security.ProtectionDomain$1.doIntersectionPrivilege(ソース不明) java.awt.EventQueue$4.run(ソース不明) java.awt.EventQueue$4.run(ソース不明) java.security.AccessController.doPrivileged(ネイティブメソッド) java.security.ProtectionDomain$1.doIntersectionPrivilege (不明なソース) で java.awt.EventQueue.dispatchEvent (不明なソース) で java.awt.EventDispatchThread.pumpOneEventForFilters (不明なソース) で java.awt.EventDispatchThread.pumpEventsForFilter(不明なソース) でjava.awt.EventDispatchThread.pumpEventsForHierarchy(不明なソース)java.awt.EventDispatchThread.pumpEvents(不明なソース) java.awt.EventDispatchThread.pumpEvents(不明なソース) java.awt.EventDispatchThread.run(不明なソース)

なぜ理解できないのですか、別の.javaファイルに別のクラスがあり、sql liteデータベースと接続していますが、現時点では呼び出されていません。なぜEclipseはこの間違いをするのですか?!?!! 彼が考えているところから、「最初はorg.mysqlでうまくいきましたが、2番目にorg.sqliteで試してみます」

:|

4

1 に答える 1

2

何が起こっているのか理解できたと思います。DriverManager.getConnection を呼び出すと、使用可能なすべてのドライバーが 1 つずつ成功するまで試行されます。ドライバーで connect を呼び出すと、ドライバーが間違っている場合は null を返し、失敗した場合は例外をスローし、成功した場合は Connection オブジェクトを返します。すべてのドライバーが失敗すると、DriverManager は最初に取得した例外があればそれをスローするか、または「適切なドライバーが見つかりません」という例外を作成してスローします。

これはおそらくあなたのケースで起こっていることです:
- DriverManager は最初に sqlite ドライバーを試しています。URL に対して間違ったドライバーであるため、null を返すはずですが、代わりに例外をスローしています (これは sqlite ドライバー実装のバグです!)
- 次に、DriverManager は mysql ドライバーを試していますが、接続に失敗します。その他の理由 (たとえば、サーバーが実行されていない、またはパスワードが間違っている)
- DriverManager は、すべてのドライバーが接続に失敗したことを確認するため、取得した最初の例外 (sqlite からの例外) をスローします (実装のバグによる)。

できること:
- クラスパスから sqlite ドライバーを一時的に削除して、mysql 接続の問題を解決します
- DriverManager の代わりに DataSource を使用することをお勧めします。Mysql の例:

MysqlDataSource ds = new MysqlDataSource();
ds.setServerName(serverName);
ds.setDatabaseName(mydatabase);
ds.setUser(username);
ds.setPassword(password);
connection = ds.getConnection();

または、データベース ライブラリを使用して処理することもできます

于 2013-09-11T18:35:48.413 に答える