【问题标题】:Error Inserting into Database from Java从 Java 插入数据库时​​出错
【发布时间】:2012-03-09 21:35:16
【问题描述】:

我将以下字符串传递给执行插入的方法,但是每次尝试执行此操作时,都会出现错误。

PropInsert = "INSERT INTO Image_has_Props (Image_ImageID, Props_PropID), SELECT "+IntImageID+", PropID FROM Props WHERE PropDescription = '"+StrPropDescription+"';";

您可以在错误中看到,似乎有一个额外的 ' 在它显示血压监测器的位置之后。我不知道这个额外的 ' 是从哪里来的。我从 JComboBox 中获取 StrPropDescription。

StrPropDescription = propChoice.getSelectedItem().toString();

【问题讨论】:

  • 仔细查看StrPropDescription。它是否以' 结尾?
  • 最后的“额外”引号看起来就像在给我的错误消息中的 SELECT 语句开头打开的结束引号。
  • @MattGibson 好地方!只是意味着现在有其他问题!不过谢谢!
  • 不明白为什么这个问题被否决了。

标签: java sql insert-select


【解决方案1】:

我想你只是多了一个逗号。试试

PropInsert = "INSERT INTO Image_has_Props (Image_ImageID, Props_PropID) SELECT "+IntImageID+", PropID FROM Props WHERE PropDescription = '"+StrPropDescription+"';";

注意 INSERT 和 SELECT 之间没有逗号。

【讨论】:

    【解决方案2】:

    首先,直接从用户输入生成sql语句是一件危险的事情!

    其次,您可能希望在 sql 语句之前转储 StrPropDescription 的值,以确保它具有您认为应该的值。

    很可能,它的末尾会有一个撇号。然后是从源头向后追溯以查看该变量在何处/如何更改的问题。

    【讨论】:

    • 用户实际上是从 JComboBox 中选择要输入的值,所以它不是太危险!检查打印的内容是正确的,最后没有撇号,
    • 仍然值得清理您的输入,因为未来的案例总是会出现在列表中的“O'Malley Corporation 血压监测器”:)
    • @MattGibson 对此无可争辩,这种方式正好适合我目前的需要!
    【解决方案3】:

    末尾的额外 ' 只是整个 select 语法的引号,匹配 SELECT 之前的那个。 SELECT, SELECT 1, PropID" Is 1 a column name?

    【讨论】:

      【解决方案4】:

      A) 这不是有效的 SQL。您在(Image_ImageID, Props_PropID) 之后有一个, - 使用JDBC 时,您也不要以; 结束语句。

      B) 您应该使用带有占位符的预处理语句,而不是将原始用户输入注入您的 SQL 语句。

      【讨论】:

      • 用户正在从 JComboBox 中选择值,该 JComboBox 显示来自另一个列的值列表,此处没有原始用户输入。请参阅下面的帖子,以及我最初问题的最后一行。
      • 听起来是忽略最佳实践的一个很好的理由;)老实说,真的没有理由不使用它们。
      • 反对者,想发表评论吗?还是我又让互联网上的某个人发疯了?
      • @Peddler - 我不认为你是;)它发生了......我有时会伤害人们的胡思乱想,他们会随机寻找一个帖子来投反对票。
      【解决方案5】:

      我认为这个语句的问题是你的sql语句中有一个SELECT 1,当它不是你的表中的列名时,还有INSERTSELECT语句之间的,正如这里的其他人提到的那样。

      我不完全确定您的 IntImageID 变量在这种情况下的用途,但我猜您正在尝试做两件事之一。

      1:您正在尝试从表中获取 ImageID,这是一列,在这种情况下,您需要类似:

      PropInsert = "INSERT INTO Image_has_Props (Image_ImageID, Props_PropID)
                   SELECT ImageID, PropID FROM Props 
                   WHERE PropDescription = '"+StrPropDescription+"'";
      

      2:您尝试将IntImageID 作为第一个插入值,然后从数据库中提取第二个值,在这种情况下,它将类似于以下内容:

      PropInsert = "INSERT INTO Image_has_Props (Image_ImageID, Props_PropID)
                   ("+IntImageID+", SELECT ImageID, PropID FROM Props 
                   WHERE PropDescription = '"+StrPropDescription+"')";
      

      我不太确定我是否正确编写了第二个,因为我无法对其进行测试,但基本上,如果 IntImageID 变量不在数据库表中,则它涉及将您的 IntImageID 变量与您的 SELECT 语句分开。

      【讨论】:

        猜你喜欢
        • 2013-11-06
        • 2016-05-23
        • 2017-12-28
        • 1970-01-01
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        相关资源
        最近更新 更多