16

我有 80000 个需要插入数据库的重新编码,尤其是在表中:temp(ts, temp) temp 是 INT。

问题是几乎 20000 次重新编码为空,所以我想知道当 dataType 为 INT 时如何将 NULL 插入 DB。

我试过这个:

String val = null;

//insert(ts, val) into temp 
String sql = "INSERT INTO temp" + "(val)" + " VALUES" + "('" + val + "')";
Statement st = (Statement) conn.createStatement();
count  = st.executeUpdate(sql);

不幸的是插入失败。打印出异常信息:

Incorrect integer value: 'null' for column 'val' at row 1"

希望有人可以帮助我。谢谢你。

4

6 回答 6

28

您应该使用 aPreparedStatement并使用setNull(int, int)

String sql = "INSERT INTO temp(val) VALUES (?)";
PreparedStatement st = con.prepareStatement(sql);
if (/* int value is not null */) {
   st.setInt(1, value);
} else {
   set.setNull(1, Types.INTEGER);
}
count  = st.executeUpdate();
于 2013-08-27T07:43:13.230 回答
7

作为 Mark Rotteveel 答案的替代方案,您还可以使用PreparedStatement.setObject(int, Object, int)

您指定 SQL 类型(第三个参数),如果对象为空,它会自动插入空。它更快更容易。

String sql = "INSERT INTO temp(val) VALUES (?)";
PreparedStatement st = con.prepareStatement(sql);
st.setObject(1, value, Types.INTEGER);
count  = st.executeUpdate();
于 2017-03-03T13:40:48.437 回答
2

我已经解决了这个问题。代码更新如下:

String sql= null;
if(val.isEmpty()){
System.out.println(val);
System.out.println("Insert ts: " + ts + " val: null");
sql= "INSERT INTO " + table + "(ts,val,pointId)" + " VALUES" + "(" + "'" + ts + "'" + ", " + "NULL" + " , " + "'" + pointId + "'" + ")";
}
else{
System.out.println("Insert ts: " + ts + " val: " + val);
sql= "INSERT INTO " + table + "(ts,val,pointId)" + " VALUES" + "(" + "'" + ts + "'" + ", " + "'" + val + "'" + ", " + "'" + pointId + "'" + ")";
}

Statement st = (Statement) conn.createStatement();  //create the instances of statement
count = st.executeUpdate(sql);

基本上,如果将 null 插入数据库,只需插入表(val)值(NULL)。

于 2013-08-26T20:52:00.733 回答
2

您应该考虑使用准备好的语句。如果您这样做,您将在此处和其他地方找到有关如何处理空值的信息。

如果您 100% 确定您的val值是干净的并且不会导致 SQL 注入(很少见,但可能),那么null在定义值时需要显式使用“构建字符串”方法:

String sql = "INSERT INTO temp (val) VALUES (";
if (val == null) {
  sql += "null";
} else {
  sql += val;
}
sql += ")";
于 2013-08-26T17:40:39.813 回答
0

您应该明确地CAST将 NULL 作为 INT

...VALUES(...CAST(NULL AS INT)

于 2013-08-26T17:39:15.593 回答
0

听起来您在应该发送 int 时发送“null”。也许尝试类似的东西

(val == null ? "" : val)

于 2013-08-26T17:40:01.700 回答