【问题标题】:Java SQL Incorrect Integer ValueJava SQL 不正确的整数值
【发布时间】:2014-01-22 15:27:00
【问题描述】:

这是我的错误:SQL 异常:java.sql.SQLException:不正确的整数值:第 1 行的列“年龄”的“年龄”

给我带来问题的字段是表中的第一个 Int 字段。

这是我正在使用的代码:

数据:

   String username = "test1";
    String id="test1";
    String firstName="Testname";
    String lastName="Testnamer";
    String address="Testadd";
    String phone="Test0851459574";
    String email="Testemailee";
    int age = 24;
    char sex='M';
    double height=1.23;
    int kgs=125;
    double stone=5.75;
    int targetWeightKgs=34;
    double bmi=4.34;
    String medicalHistory="testertester";
    String extraHistory="testertestertest";
    boolean smoker=true;
    boolean usernameCompleted=true;
    String myNotes="testnotes";
         UsersDatabase.insertMember(username,id,firstName,lastName,address,phone,email,age,sex,height,kgs,stone,targetWeightKgs,bmi,medicalHistory,extraHistory,smoker,usernameCompleted,myNotes);

在 insertMember 方法中:

 String sql = "INSERT INTO Members " + "VALUES      ('username','id','firstName','lastName','address','phone','email','age','sex','height','kgs','stone','targetWeightKgs','bmi','medicalHistory','extraHistory','smoker','usernameCompleted','myNotes')";
        stmt.executeUpdate(sql);

这是表格截图:http://snag.gy/VuMpO.jpg

【问题讨论】:

  • 你真的是想插入'age'吗?或者这实际上是42 还是你真实代码中的东西?因为按原样,您的 age 字段是一个 int,并且您正在尝试将 3 个字符的字符串填充到其中。
  • age 是一个整数,所以在里面插入一个 5 左右的 int
  • 您应该使用准备好的语句,并指定参数值...
  • java 不像 php 那样支持魔术引号。
  • 同意Jon Skeet,也是为了避免SQL注入攻击。您需要更改代码,如果您不这样做,您的代码中会有一个大漏洞。这里是Prepared Statement API

标签: java mysql sql database


【解决方案1】:

这个想法是通过preparedStatement创建一个查询,您可以在其中使用变量然后执行更新。

你应该这样做:

PreparedStatement st = connect.prepareStatement("INSERT INTO Members VALUES  ('?','?','?','?','?','?','?','?','?','?','?','?','?','?'','?','?','?','?','?'");
st.setString(1, username);
st.setString(2, id);

它继续,当你想设置一个 int 时:

st.setInt(8, age);

所有的值都设置好后,你要执行:

st.executeUpdate();

【讨论】:

  • 它在包 java.sql.PreparedStatement 中。您应该能够在没有外部库的情况下使用它。
  • QL Exception: java.sql.SQLException: Parameter index out of range (6 > number of parameters, which is 5).
  • 您能粘贴一下声明吗?
  • 好的。抱歉,不是“'?'”而是“?” (没有 ')。我的错误(也是一个大错误)。对不起。我应该在发布之前测试代码。
  • 你能把你的意思做一个粘贴箱吗,我不明白:)
【解决方案2】:

从所有 int 中删除 '',因为 int 插入时不带单引号。 所以你的 sql 是:

 String sql = "INSERT INTO Members " + "VALUES      ('username','id','firstName','lastName','address','phone','email',age,'sex',height,kgs,stone,targetWeightKgs,bmi,'medicalHistory','extraHistory','smoker','usernameCompleted','myNotes')";
        stmt.executeUpdate(sql);

或者你也可以使用这样的东西:

PreparedStatement pstmt = con.prepareStatement("INSERT INTO `table`
        (pid,tid,rid,tspend,description) VALUE 
        (?,?,?,?,?)");
pstmt.setString(1, pid );
pstmt.setString(2, tid);
pstmt.setString(3, rid);
pstmt.setInt(4, tspent);
pstmt.setString(5,des );
pstmt.executeUpdate();

【讨论】:

  • 使用prepared statement是在java中执行sql的更好方法
  • 对不起,第一个例子……你不是插入“用户名”、“id”、“年龄”等而不是变量的值吗?
【解决方案3】:

Java 不支持字符串插值,目前“用户名”被解释为文字字符串。如果您不希望使用准备好的语句,请考虑使用String.format 来生成要插入的值。

String sql = String.format("INSERT INTO MEMBERS VALUES ('%s', %d, '%s')", username, id, firstname);
stmt.executeUpdate(sql);

使用这样的解决方案会使您容易受到 SQL 注入和其他漏洞的影响,但我认为如果您正在使用 JDBC 并试图理解它,这是完全可以接受的。

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多