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)你的陈述,这就是它不起作用的原因。executeQuery()不能用于DML(数据操作语言)语句的方法INSERT,例如 areUPDATEDELETE. 对于这些语句,提供了为这些 DML 语句存在的Java命名方法。executeUpdate()

从文档:

executeUpdate 方法执行此 PreparedStatement 对象中的 SQL 语句,该语句必须是 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这样声明之前用真实数据替换那里的参数:

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然后你当然会关闭它,你不必为or调用close()方法,当你关闭后一切都会被关闭。statementsResultSetconnection

希望对您有所帮助。

问候

于 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 回答