1

次のコードを使用して、データベース内のUSERSというテーブルにユーザーを追加しています。他のクエリを試したので接続は正しく、Oracle自体でこのクエリを試しましたが、うまくいきました。 Javaでのクエリの問題、主にSPACEと構文が原因ですが、これの何が問題になっていますか?

try
{
    stmt=conn.createStatement();
    //query="INSERT INTO Users (user_id,username,password,first_name,last_name) " + " VALUES (seq_users.nextval,'"+usernameCreateField.getText()+"','"+new String(passwordCreateField.getPassword())+"','"+firstnameCreateField.getText()+"','"+lastnameCreateField.getText()+"') ";
    query="INSERT INTO Users (user_id,username,password,first_name,last_name) " +" VALUES (seq_users.nextval,'test','test','test','test') ";
    rset=stmt.executeQuery(query);
}
catch(SQLException | NumberFormatException e)
{
    System.out.println("result error, " +e.getMessage());
}
finally
{
    try
    {
        rset.close();
        stmt.close();
    }
    catch(Exception e)
    {
        System.out.println("Error in closing "+e.getMessage());
    }
}
4

3 に答える 3

3

だから問題はあなたがexecuteQuery(query)あなたの声明を呼びかけることであり、これがそれが機能しない理由です。、、などのDML(データ操作言語)ステートメントにexecuteQuery()は使用できないメソッド。これらのステートメントに対して、これらのDMLステートメントに存在するという名前のメソッドを提供します。INSERTUPDATEDELETEJavaexecuteUpdate()

ドキュメントから:

executeUpdateメソッドは、このPreparedStatementオブジェクトのSQLステートメントを実行します。これは、INSERT、UPDATE、DELETEなどのSQLデータ操作言語(DML)ステートメントである必要があります。または、DDLステートメントなどの何も返さないSQLステートメント。

したがって、実際のメソッドをこれに置き換えるだけで、機能します。

そして、私の好奇心をお詫びしますが、なぜパラメータ化されたSQLステートメントを使用していないのですか?パラメータ化されたステートメントを使用しないと、 SQLインジェクションの危険性が高くなり、多くのハッカーがこれをデータベースの損傷に使用することをご存知でしょう。あなたはそれについて考える必要があります。データベースをより安全にしたい場合は、非常に重要です。データベースでSQLインジェクションを証明するものは信じられないでしょう。

たとえば、次のようなクエリを作成する必要があります。

query = "INSERT INTO Users (user_id,username,password,first_name,last_name) values(?,?,?,?,?) ";

この?文字は1つのパラメーターを表しています。番号付けは、ゼロからではなく、1、2、3などで始まります。

execute次に、次のようにステートメントを作成する前に、パラメータを実際のデータに置き換える必要があります。

PreparedStatement ps = conn.prepareStatement(query);
// no set parameters
ps.setInt(1, someDTO.getId());
ps.setString(2, someDTO.getUserName());
ps.setString(3, someDTO.getPassword());
ps.setString(4, someDTO.getFirstName());
ps.setString(5, someDTO.getLastName());
ps.executeUpdate();
System.out.println("Data was inserted successfully.");
return true;

SQLインジェクションの詳細:ここここ

編集:

私があなたのコードを見ているとき、あなたが開いたときconnection、そしてもちろんあなたがそれを閉じるとき、あなたはあなたに言うのを忘れました、あなたはまたはのclose()メソッドを呼び出す必要はありstatementsません、あなたが閉じるとResultSetすべてが閉じられますconnection

それがあなたを助けることを願っています。

よろしく

于 2012-05-26T15:23:52.893 に答える
3

あなたがやろうとしているのはDML操作です。交換してみてください

rset=stmt.executeQuery(query);

int affectedRows = stmt.executeUpdate(query);
于 2012-05-26T14:54:24.310 に答える
0

これを試して...

try {    
String URL = "jdbc:sqlserver://127.0.0.1:1433;databaseName=(databaseNameHere)";    

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn2 = DriverManager.getConnection(URL,"username","userpassword");

String sql = "INSERT INTO tableNameHere(user_id,username,password,first_name,last_name) values(?,?,?,?,?)";

ps = conn2.prepareStatement(sql);
ps.setString(1, user_id);
ps.setString(2, username);
ps.setString(3, password);
ps.setString(4, first_name);
ps.setString(5, last_name);  

}
于 2017-04-04T06:36:06.813 に答える