在以下情况下如何使用准备好的语句?

发布于 2024-12-08 10:20:30 字数 2164 浏览 1 评论 0原文

我有以下 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) 在 com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:3191) 在 PSMTTest.main(PSMTTest.java:45)

我的用户 ID 是主键和自动增量字段,因此它的值是由数据库自动生成的。 对于名字和姓氏字段,我有值。 但对于日期,我想添加数据库的当前数据和时间。

如果地址尚未提供,因此应保留原样

请告诉我的朋友,我的代码中的查询有什么问题? 为什么要例外? 请各位朋友指导一下! 谢谢你!

I have following database schema for 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)                

Here is my java code;

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();
    }
}
}

But when I am tries to run the code It throws following exception

java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2474)
at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:3191)
at PSMTTest.main(PSMTTest.java:45)

My userid is a primary key and auto increment field so value for it is automatically generated by database.
for the fields firstname and lastname I have the values.
but in case of date I want to add current data and time of the db.

In case of address the value is not provided yet so it should be kept as it is

Please tell me friends whats wrong with the query in my code?
why its giving an exception?
please guide me friends!
Thank You!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

生死何惧 2024-12-15 10:20:30

错误消息是不言自明的 - 您只指定了两个参数占位符(问号),但您正在尝试使用索引 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 中完全删除。

The error message is self-explanatory - you've only specified two parameter placeholders (question marks) but you're trying to use indexes 2 and 3. So this:

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

should be:

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

The fact that they are the second and third fields within the value list is irrelevant - they're the first and second parameters.

You could make the correspondence clearer by reordering your SQL though:

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

Now the first and second prepared statement parameters correspond with the first and second fields specified in the SQL.

It's not clear to me that you need to specify the userid field anyway, mind you - given that it's going to be provided by default. I would remove it from the SQL entirely, to be honest.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文