无法从java向数据库添加新用户

时间:2012-05-26 14:32:01

标签: java database oracle

我正在使用以下代码将用户添加到我的数据库中名为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());
    }
}

3 个答案:

答案 0 :(得分:3)

您要做的是DML操作。尝试替换

rset=stmt.executeQuery(query);

int affectedRows = stmt.executeUpdate(query);

答案 1 :(得分:3)

问题是您在语句中调用executeQuery(query),这就是为什么它不起作用的原因。您不能用于 DML(数据操作语言)语句的executeQuery()方法,例如INSERTUPDATEDELETE。对于这些语句,Java提供了这些DML语句存在的名为executeUpdate()的方法。

来自文档:

  

executeUpdate方法在此执行SQL语句   PreparedStatement对象,必须是SQL数据操作   语言(DML)语句,例如INSERT,UPDATE或DELETE;或SQL   不返回任何内容的语句,例如DDL语句。

所以只能用这个替换实际的方法,它会起作用。

对不起我的好奇心,但为什么你没有使用参数化的SQL陈述?您会知道不使用参数化语句存在 SQL注入的高危险,并且许多黑客将此用于损坏数据库。你应该考虑一下。如果您希望您的数据库更安全,这一点非常重要。你不会相信什么证明SQL注入数据库。

仅举例来说,您应该创建如下查询:

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

?字符表示一个参数。编号从1,2,3等开始,而不是从零开始。

然后你必须在execute语句之前用实际数据替换params:

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注入的更多信息:herehere

修改

我只是在看你的代码时忘了告诉你,当你打开connection然后你会关闭它时,你不必为close()statements调用ResultSet方法{1}},关闭connection后,所有内容都将关闭。

希望对你有所帮助。

此致

答案 2 :(得分: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);  

}