在sql中参数化插入/更新

时间:2015-11-16 22:19:21

标签: java sql postgresql

我正在尝试插入我拥有的数据库,我想通过参数这样做。我正在使用java连接到postgres数据库。

我可以很好地连接到数据库。我知道因为我可以看到我正在使用的各种操作,我可以看到,并更新我的数据库中的现有行。我在使用INSERT时遇到问题。

我有以下内容:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void errorInput()
{   
    fprintf(stderr, "\nYou have received this message due to an error. \n");
    fprintf(stderr, "Please type 'filetype <file>' to properly execute the program.\n");
    fprintf(stderr, "Thank you and have a fine day! \n\n");
    exit(0);
}

int main(int argc, char *argv[])
{

  char command[128];

  if (argc == 2)
  {
    strcpy(command, "file ");
    strcat(command, argv[1]);
    system(command);
  }
  else
  {
    errorInput();
  }

  return 0;
}

我将它们初始化:

private String _update_rentals = "INSERT into rentals (cid, mid) values (?,?)"; 
private PreparedStatement _update_rentals_statement; 

private String _update_movie_status = "UPDATE Movie SET checkedout = true WHERE mid = ?";
private PreparedStatement _update_movie_status_statement;

_update_movie_status_statement = _customer_db.prepareStatement(_update_movie_status); 
        _update_rentals_statement = _customer_db.prepareStatement(_update_rentals); 

我在两个executeQuery()调用中都出错了。由于某种原因,我得到以下错误:

while (movieAvail.next()){
            System.out.println(movieAvail.getBoolean(1));
            if (movieAvail.getBoolean(1) == false){
                //Do chekcout

                _update_rentals_statement.clearParameters();
                _update_rentals_statement.setInt(1, cid);
                _update_rentals_statement.setInt(2, mid);
                _update_rentals_statement.executeQuery(); 

                _update_movie_status_statement.clearParameters();
                _update_movie_status_statement.setInt(1, mid);
                _update_movie_status_statement.executeQuery(); 


                System.out.println("Enjoy your movie!"); 
            } 
}

我查看了其他帖子,我相信我正在遵循插入/更新的语法,所以也许我忽略了这一点。

这是更大代码库的所有部分,因此我不想包含这些代码片段所包含的方法。但这些是与此代码相关的独立实例。

2 个答案:

答案 0 :(得分:3)

通常,当您执行query时,您愿意从数据库中检索某种信息。执行SELECT查询时通常会出现这种情况。但是,对于INSERTUPDATE语句,您不是查询数据库,而只是执行更新或插入新行。在PreparedStatement的文档中,您可以看到在尝试调用executeQuery时,在哪些情况下会引发异常:

  

抛出:SQLException - 如果发生数据库访问错误;这种方法   在关闭的PreparedStatement上调用,或者SQL语句不调用   返回一个ResultSet对象

因此,在您的情况下,问题是您的语句不会返回ResultSet。您应该使用executeexecuteUpdate代替。前者只是执行更新,而后者执行相同操作,但也返回受影响的行数。

答案 1 :(得分:1)

我认为主要问题是您正在调用executeQuery(),它希望返回结果,但Insert / Update不是查询而且不会返回结果。尝试只调用execute()。