1

ユーザーがデータベース内にデータを保存できるようにするメソッドを作成しています。

私が抱えている問題は、ユーザーの ID のためにデータベースに数値データ型を格納することです。

まず、ID 番号が自動インクリメントされているかどうかを確認するにはどうすればよいですか? これらはそのプロパティです:

Type: Numeric
Column size: 4
Decimal digits: 0
Part of primary key: true
Part of an index: true
Position: 1

インデックスの一部として設定すると(true)、自動インクリメントが可能になることをどこかで読んだと確信しています。誰でも確認できますか?

さらに重要なことに、テーブルにデータを挿入すると、次のようなエラーが表示されます。

Columns of type 'NUMERIC' cannot hold values of type 'CHAR'. 

これは私の挿入コードのスニペットです (必要に応じてさらに明らかにすることができます):

Statement pStatement = conn.createStatement();
String selectSQL = ("INSERT INTO APP.PERSON VALUES ('" + '3' + "','" + user + "','" + pass + "','" + fName + "','" + sName + "','" + sQuestion + "','" + sAnswer + "') ");
pStatement.executeUpdate(selectSQL);

ご覧のとおり、ID (最初の値) を手動で 3 に設定しています。これがエラーを引き起こしていると思います。INSERT コマンドを使用して数値を挿入する方法を知りたいです。

Mac OS X Mountain Lion で Netbeans 7.3 Beta 2 を使用して、Java でコーディングしています。Derby データベースを使用しています。

4

3 に答える 3

4

やあ仲間私はあなたがprepareStatementを使うことをお勧めします

String template = "INSERT INTO APP.PERSON VALUES (YOUR,TABLE,COLLUMN,NAME) values (?,?,?,?)";
           PreparedStatement stmt = yourConnection.prepareStatement(template);

したがって、IDを整数として設定したい場合は、javaにそれをさせてください

       stmt.setInt(1, ID);
       stmt.setString(2, user);
       stmt.setString(3, fName);
       stmt.executeUpdate();

テーブル構造がどのようになっているのかわかりませんが、これは int use を使用する場合の例ですstmt.setInt(1, 3);

1--> 文字列テンプレートで設定した位置

3--> ID をハードコーディングしたいかもしれません

これが prepareStatement を使用するパターンの例です

String name = "shadrach"
Double price = "100.00"
int qty = 3;
    String template = "INSERT INTO PRODUCT (NAME,PRICE,QTY) values (?,?,?)";
                PreparedStatement stmt = connection.prepareStatement(template);
                stmt.setString(1, name);
                stmt.setDouble(2, price);
                stmt.setInt(3, qty);
                stmt.executeUpdate();
于 2013-02-07T02:24:58.850 に答える
1

数値を一重引用符で囲んではなりません。他の列のデータ型の型はわかりませんが、数値には一重引用符を含めないでください。

Statement pStatement = conn.createStatement();

String selectSQL = ("INSERT INTO APP.PERSON VALUES (3,'" + user + "','" + pass + "','" + fName + "','" + sName + "','" + sQuestion + "','" + sAnswer + "') ");

 pStatement.executeUpdate(selectSQL);

またPreparedStatement、SQL を実行するために文字列を連結すると、SQL インジェクション攻撃に対して脆弱なままになります。準備されたステートメントは、このリスクを軽減するのに役立ちます。

于 2013-02-07T01:55:49.577 に答える
1

テーブルが数字を期待しているときに、文字3を挿入しています。

ResultSetMetaDataの isAutoIncrement メソッドを使用して、列が自動インクリメントかどうかを確認できます。それが役立つことを願って....

于 2013-02-07T01:58:07.827 に答える