0

プリペアド ステートメントを使用してレコードを (組み込み Java データベースに) 挿入しようとしています。保存ボタン(JButton)をクリックしたときに情報が入力されるようにしたい。私は Java を初めて使用し、準備済みステートメントを使用したことがありません。

接続 (con) が接続であることを認識させるのに問題があります。次のコードは、アクション リスナーに配置する準備済みステートメント用です。

私が間違っていることを教えてください。お時間をいただきありがとうございました。コードを正しく実行したことを願っています。

String sql = "INSERT INTO Users (UserId, fName, lastName, userName, password) VALUES (?, ?, ?, ?, ?)";
PreparedStatement stmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

stmt.setString(2, "fName" );
stmt.setString(3, "lastName" );
stmt.setString(4, "userName" );
stmt.setString(5, "password" );
stmt.executeUpdate();
4

3 に答える 3

4

このスニペット:

Connection con = DriverManager.getConnection(host, uName, uPass);

Connection conがローカルでのみ定義されていることを示します。これをクラス メンバー変数にして、次を使用します。

con = DriverManager.getConnection(host, uName, uPass);

あなたの最初のパラメータを設定していないようですPreparedStatement

stmt.setString(1, UserId);

また、パラメータにリテラル値を設定してもよろしいですか?

アップデート:

最初のパラメーターは自動生成されるため、おそらく次のものが必要になります。

String sql = "INSERT INTO Users (fName, lastName, userName, password) VALUES (?, ?, ?, ?)";

PreparedStatement stmt = ...   
stmt.setString(1, fName);
stmt.setString(2, lastName);
stmt.setString(3, userName);
stmt.setString(4, password);
于 2012-12-30T20:12:04.400 に答える
1

問題は、準備されたステートメントにはありません。それよりも基本的なことです。

con.prepareStatement... con に下線が引かれ、変数が見つからないことが示されています

つまりcon対象外です。あなたが実際に何をしたかはわかりませんが、例を次に示します。

if (foo) {
    Connection con = DriverManager.getConnection(host, uName, uPass);
}
String sql = "INSERT INTO Users (UserId, fName, lastName, userName, password) " +
             "VALUES (?, ?, ?, ?, ?)";

// Compilation error     vvv
PreparedStatement stmt = con.prepareStatement(sql, 
                                              Statement.RETURN_GENERATED_KEYS);

問題は、それconがローカル変数であり、それが宣言されているブロックの最後でスコープ外になることです。スコープ外の変数を使用しようとすると、コンパイラはそれが見つからないと言います。本質的に、それはあなたが話している変数を知りません....

于 2012-12-30T21:32:25.300 に答える
0

データベースに接続するための接続オブジェクトを作成するには、次のように試してください...

Connection con = DriverManager.getConnection(DB_host, DB_UserName, DB_UserPassword);

Connection クラスのローカル オブジェクト con を作成します。

あなたの声明から、自動インクリメント フィールドとしてUserIdを使用していることがわかります。明示的に値を入力する必要はありません。

したがって、urステートメントを次のように変更します

String sql = "INSERT INTO Users (fName, lastName, userName, password) VALUES (?, ?, ?, ?)";
PreparedStatement stmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
stmt.setString(1, "fName" );
stmt.setString(2, "lastName" );
stmt.setString(3, "userName" );
stmt.setString(4, "password" );
stmt.executeUpdate();

やってみて。それがうまくいくことを願っています。

于 2013-02-04T11:24:20.170 に答える