INSERT INTO STATEMENT 在我的 for-each 循环中不起作用

Posted

技术标签:

【中文标题】INSERT INTO STATEMENT 在我的 for-each 循环中不起作用【英文标题】:INSERT INTO STATEMENT not working in my for-each loop 【发布时间】:2014-03-22 11:45:05 【问题描述】:

我有这样的代码,

Let m = 7;

for(int i=0, i<m, i++)
 con.setAutoCommit(false)
 PreparedStatement ps = con.prepareStatement("INSERT INTO Numbers VALUES (i, "This is   sparta")");
 ps.executeUpdate();
 con.commit();
 con.setAutoCommit(true);

现在的问题是,我的数据库表是这样的......

Number       Name
________________________________
1234567      This is sparta

而不是...

Number        Name
_________________________________
1         This is sparta

2         This is sparta

3         This is sparta

4         This is sparta

5         This is sparta

6         This is sparta

7         This is sparta

我哪里出了大错?

谢谢

【问题讨论】:

请贴出真实的代码,你的代码编译不出来。 两个厘米。 1) 按预期使用PreparedStatement,使用INSERT INTO Numbers VALUES (?,?) 创建语句,然后绑定值。 2)这个查询非常错误,发布一个不会引发大量错误的查询。 如果您不想发布真实代码,请确保此代码能够按照您描述的方式编译和重现您的问题。 【参考方案1】:

即使你让它工作,这也不是一个准备好的语句。你应该使用值占位符 充分利用 PreparedStatement

con.setAutoCommit(false);

final String value = "This is Xerxes";

PreparedStatement ps = con.prepareStatement("INSERT INTO Numbers VALUES (?,?)");
for (int i=0, i<m, i++)

    ps.setInt(1,i);
    ps.setString(2,value);
    ps.executeUpdate(); 

ps.close();

con.commit();

您应该在所有插入语句完成后将其设为一次提交

【讨论】:

嗨,我不断收到此错误“数据截断:列的值超出范围,“数字”。这是因为它没有创建 7 条记录,而是创建了一条值为 1-7 的记录。我该如何解决这个问题? 先删除旧内容;它应该工作。也许您有一个用于限制位数的第一个数字字段的自动增量字段。那么最好只使用number INT AUTOINCR 而不限制为 1 位,或者删除 AUTOINCR。 @Joop 感谢您在循环外声明准备好的语句并关闭它:) 从 Java 7 开始,可以使用 try (PreparedStatement ps = con.pre...) for catch (SQLException e) ... (无需关闭)。但是,如果您想显示导致错误的单个值,则 for 循环的内容也必须接收 try-catch。 在 Java 7 之前,前面的数字使它成为八进制数字,而 008 会出错。如果您使用的是 Java 6,请使用 parseInt(n, 10)

以上是关于INSERT INTO STATEMENT 在我的 for-each 循环中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

INSERT INTO with VALUES 和 SELECT STATEMENT

cannot insert multiple commands into a prepared statement问题原因及解决办法

MS Access 的 SQL INSERT INTO 语句

在 INSERT INTO 语句中插入值时出现语法错误。 -VB 和 ACCESS 2013

使用 DateTime 时 INSERT INTO 语句中的语法错误

在 MonetDBLite 中使用“INSERT INTO test VALUES”加载巨大的表