1

チュートリアルでこのコードを見つけましたが、接続を試みてデバッグすると機能しません。その後、DriverManager.getConnection() の下のコード行を実行せずに、finally ブロックに移動するだけで例外がスローされません。なんで?誰にもアイデアがありますか?

            Connection con = null;
            Statement st = null;
            ResultSet rs = null;

            String url = "jdbc:mysql://host/databasename";
            String user = "user";
            String password = "pass";


            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            try {
                con = (Connection) DriverManager.getConnection(url, user, password);
                st = (Statement) con.createStatement();
                rs = st.executeQuery("SELECT * FROM Message");

                if (rs.next()) {
                    System.out.println(rs.getString(1));
                }

            } catch (SQLException ex) {
                Logger lgr = Logger.getLogger(Version.class.getName());
                lgr.log(Level.SEVERE, ex.getMessage(), ex);

            } catch (java.sql.SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            finally {
                try {
                    if (rs != null) {
                        rs.close();
                    }
                    if (st != null) {
                        st.close();
                    }
                    if (con != null) {
                        con.close();
                    }

                } catch (SQLException ex) {
                    Logger lgr = Logger.getLogger(Version.class.getName());
                    lgr.log(Level.WARNING, ex.getMessage(), ex);
                } catch (java.sql.SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

Logcat はこれを書きます: Logcat メッセージ

4

2 に答える 2

1

1)DriverManager.getConnection()型のオブジェクトを返すConnectionため、キャストする必要はありません。同じことst = (Statement) con.createStatement();

2) リモート マシンで MySQL を実行している場合を除き、ローカル マシンに MySQL がインストールされていることを確認する必要があります。ローカル マシンで MySQL を実行することにした場合は、他のすべてが同じままであることを前提として、それに接続できます。String url = "jdbc:mysql://localhost/{existing_db_name}";

3) 同じ例外を 2 回キャッチしているようです。

try{
    con = (Connection) DriverManager.getConnection(url, user, password);
    ...
}catch (SQLException ex) {
    Logger lgr = Logger.getLogger(Version.class.getName());
    lgr.log(Level.SEVERE, ex.getMessage(), ex);
} catch (java.sql.SQLException e) {
    e.printStackTrace();
}

その結果、例外メッセージを に出力する 2 番目の catch ブロックSystem.errは実行されません。代わりに、例外メッセージをLogger. これが、実際には例外がスローされているのに、例外がスローされていないと思う理由かもしれません。

4) MySQL 用の JDBC ドライバーをダウンロードしたことを確認します。これをコピーして、プロジェクトのディレクトリに貼り付けます。

于 2013-07-21T15:15:00.630 に答える
0

一部のキャッチ ブロックを削除しました。

    Connection con = null;
    Statement st = null;
    ResultSet rs = null;

    String url = "jdbc:mysql://host:3306/databasename";
    String user = "user";
    String password = "pass";


    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    try {
        con = (Connection) DriverManager.getConnection(url, user, password);
        st = (Statement) con.createStatement();
        rs = st.executeQuery("SELECT * FROM Message");

        if (rs.next()) {
            System.out.println(rs.getString(1));
        }

    } catch (SQLException ex) {
        ex.printStackTrace();

    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    finally {
        try {
            if (rs != null) {
                rs.close();
            }
            if (st != null) {
                st.close();
            }
            if (con != null) {
                con.close();
            }

        } catch (SQLException ex) {
            ex.printStackTrace();
    }

}

使用している文字列の URL を指定していただけますか? この時点で、これらの変更により、明らかに、jdbc:mysql://host/databasename に適したドライバーが見つからないというSQLExceptionが発生します。

于 2013-07-21T17:28:09.107 に答える