0

ms アクセスで作成したデータベース テーブルに値を挿入したいと考えています。このコードは以前は機能していましたが、なぜエラーが発生するのか理解できません。

Exception in thread "main" java.lang.NullPointerException
at storeapp.Trylog.<init>(Trylog.java:28)
at storeapp.Trylog.main(Trylog.java:45)

ドライバーを正しく構成したと思います。

ユーザー名とパスワードの列を持つテーブル名 ACCOUNT があります。

そして、ここにコードがあります.....

public class Trylog extends JFrame{
Connection con;
Statement st;
ResultSet rs;

public Trylog(){
    connect();

    String u = "Katherine";
    String p = "kat";

    String sql = "Insert into ACCOUNT(Username, Password) Values ('"+u+"' , '"+p+"' ) ";
    try {
        rs = st.executeQuery(sql);
    } catch (SQLException ex) {
    }
}

public void connect(){
    try {
            String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
             Class.forName(driver);
             String db = "jdbc:odbc:access";
             con = DriverManager.getConnection(db);
             st = con.createStatement();
    }
    catch (Exception ex){}
}

public static void main(String[] args) {
    Trylog r = new Trylog();
    r.setVisible(true);
    r.setSize(600, 800);
    r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

なぜこのようなエラーが発生するのか誰にもわかりますか?

これは、28行目と46行目から例外ベースを引き起こす行です

rs = st.executeQuery(sql);

 Trylog r = new Trylog();

印刷します

Exception in thread "main" java.lang.RuntimeException: java.sql.SQLException: No ResultSet was produced

原因: java.sql.SQLException: ResultSet が生成されませんでした

4

3 に答える 3

3

あなたの具体的な問題は、例外処理が悪いことが原因です (さらに、例外処理がまったくありません)。次のように、例外を完全に飲み込む catch ブロックがあります。

catch (Exception ex){}

このようにして、例外が発生した場合でもコードは実行され続けtry、ブロック内の変数が初期化されていないままになる可能性がありますst。その後、これらの初期化されていない (つまり、まだ であるnull) 変数がアクセスされ、NullPointerException.

これは起こるべきではありません。例外がキャッチされると、コードはそれを適切に処理する必要があります。この場合、すぐに停止し、何らかの方法でエラーの詳細を表示する必要があります。現時点では、実行時例外として再スローするのが最も簡単です。これにより、少なくとも問題に関するすべての必要な情報を取得できます。

catch (Exception ex) { 
    throw new RuntimeException(ex);
}

(たとえば、スタックトレースをログに記録し、ユーザーフレンドリーなメッセージダイアログを表示してからプログラムを終了することで、いつでもこれを改善できます)

スローされた例外は、基本的に問題の根本原因に対する完全な答えです。技術は、スタックトレースを解釈して理解できるようにすることです。


あなたのアップデートに従ってアップデートしてください

java.sql.SQLException: No ResultSet was produced

ほら、あなたの答えがあります!ResultSet生成されることを期待していましたが、指定されたクエリに対してまったく生成されていません。実際、INSERTクエリは結果セットを返しません。最大で、影響を受ける行の量が返されます。

交換する必要があります

rs = st.executeQuery(sql);

st.executeUpdate(sql);

javadocおよびjavadocも参照してexecuteQuery()くださいexecuteUpdate()。どの SQL ステートメントに対してメソッドを使用する必要があるかを正確に示します。

executeQuery

指定された SQL ステートメントを実行し、単一のResultSetオブジェクトを返します。

パラメータ: sql- データベースに送信される SQL ステートメント、通常は静的 SQLSELECTステートメント

executeUpdate

指定された SQL ステートメント (INSERT、UPDATE、DELETE ステートメント、または SQL DDL ステートメントなどの何も返さない SQL ステートメント) を実行します。

パラメータ: - 、またはsqlなどの SQL データ操作言語 (DML) ステートメント。または、DDL ステートメントなど、何も返さない SQL ステートメント。INSERTUPDATEDELETE

于 2012-10-21T02:32:24.593 に答える
1

Your code is not specifying which DB to connect to. Hence the error. try printing the stack trace in all the catch blocks, you will see that.

于 2012-10-21T02:30:01.473 に答える
1

あなたのコードは動作していますが、アクセス ファイルの場所を変更する可能性がある dsn 構成に唯一の問題があります。dsn を再構成します。変更なしで同じコードで作業しました。ユーザー名、パスワードの2つの列を持つアクセスデータベーステーブルアカウントを作成しました。

于 2013-02-13T06:25:23.570 に答える