как использовать подготовленное утверждение в следующем случае? - PullRequest
0 голосов
/ 07 октября 2011

У меня есть следующая схема базы данных для tabel tblpers

Field      Type         Null    Key     Default              Extra           Privileges                 

userid     int(11)      NO      PRI     (NULL)               auto_increment  
firstname  char(10)     NO                                
lastname   char(15)     NO              192.168.1.15
sdate  datetime     NO              0000-00-00 00:00:00
address    varchar(100) YES             (NULL)                

Вот мой код Java;

public class PSMTTest {

private static String jdbcDriver = "org.gjt.mm.mysql.Driver";
private static String host="localhost";
private static String userName = "root"; 
private static String password = "rootpass";

public static void main(String args[]){

    Connection con=null;
    try{
        if(jdbcDriver!=null){
            Class.forName(jdbcDriver);
            String url = "jdbc:mysql://"+host+"/mysql";
            con = DriverManager.getConnection(url,userName,password);

            String insertQuery="insert into `querytest`.`tblpers` " +
            "(`userid`,`firstname`,`lastname`,`sdate`,`address`)values ( NULL,?,?,Now(),NULL);";

            System.out.println("insertQuery : "+insertQuery);

            PreparedStatement psmt=con.prepareStatement(insertQuery);

            psmt.setString(2,"param");
            psmt.setString(3,"ganak");  //as per the sql exception error comes here
            psmt.executeUpdate();
            psmt.close();

        }
    }catch(ClassNotFoundException cnfe){
        cnfe.printStackTrace();
    }catch(SQLException sqle){
        sqle.printStackTrace();

    } catch (FileNotFoundException e) {

        e.printStackTrace();
    }
}
}

Но когда я пытаюсь запустить код, он выдает следующее исключение

java.sql.SQLException: индекс параметра вне диапазона (3> количество параметров, которое равно 2). на com.mysql.jdbc.PreparedStatement.setInternal (PreparedStatement.java:2474) at com.mysql.jdbc.PreparedStatement.setString (PreparedStatement.java:3191) на PSMTTest.main (PSMTTest.java:45)

Мой ИД пользователя - это первичный ключ и поле автоинкремента, поэтому значение для него автоматически генерируется базой данных. для полей имя и фамилия у меня есть значения. но в случае даты я хочу добавить текущие данные и время БД.

В случае адреса значение еще не предоставлено, поэтому его следует сохранить как есть

Скажите, пожалуйста, друзья, что не так с запросом в моем коде? почему это дает исключение? пожалуйста, ведите меня, друзья! Спасибо!

1 Ответ

5 голосов
/ 07 октября 2011

Сообщение об ошибке самоочевидно - вы указали только два параметра-заполнителя (вопросительные знаки), но пытаетесь использовать индексы 2 и 3. Так что:

psmt.setString(2, "param");
psmt.setString(3, "ganak");

должно быть:

psmt.setString(1, "param");
psmt.setString(2, "ganak");

Тот факт, что они являются вторым и третьим полями в списке значений, не имеет значения - это первый и второй параметры .

Вы можете сделатьсоответствие уточняется путем изменения порядка SQL:

String insertQuery = "insert into `querytest`.`tblpers` " +
    "(`firstname`, `lastname`, `sdate`, `userid`, `address`) values " + 
    "(?, ?, Now(), NULL, NULL);";

Теперь параметры первого и второго подготовленных операторов соответствуют первому и второму полям, указанным в SQL.

Мне не ясно, чтовам нужно для указания поля userid в любом случае, учтите - это будет предоставлено по умолчанию.Если честно, я бы полностью удалил его из SQL.

...