从Java插入数据库时出错

从Java插入数据库时出错,java,sql,insert-select,Java,Sql,Insert Select,我将以下字符串传递给一个方法以执行插入,但是每次尝试这样做时,都会出现一个错误 PropInsert = "INSERT INTO Image_has_Props (Image_ImageID, Props_PropID), SELECT "+IntImageID+", PropID FROM Props WHERE PropDescription = '"+StrPropDescription+"';"; 你可以在错误中看到,在显示血压监视器的地方似乎有一个额外的。我不知道这个额外的'是从

我将以下字符串传递给一个方法以执行插入,但是每次尝试这样做时,都会出现一个错误

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

你可以在错误中看到,在显示血压监视器的地方似乎有一个额外的。我不知道这个额外的'是从哪里来的。我从JComboBox获得StrPropDescription

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

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

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


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

末尾的“额外”只是整个select语法的引号,与select之前的引号相匹配。我想在SELECT,SELECT 1,PropID“1是列名吗?

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

PropInsert = "INSERT INTO Image_has_Props (Image_ImageID, Props_PropID) SELECT "+IntImageID+", PropID FROM Props WHERE PropDescription = '"+StrPropDescription+"';";
请注意,INSERT和SELECT之间缺少逗号。

a)这是无效的SQL。在
(Image\u ImageID,Props\u PropID)
之后有一个
-在使用JDBC时,语句也不会以
结尾


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

我认为此语句的问题在于,SQL语句中有一个
SELECT 1
,而它不是表中的列名,并且
介于
INSERT
之间ode>选择此处其他人提到的语句

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

1:您试图从表中获取ImageID,这是一个列,在这种情况下,您可能需要如下内容:

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

2:您试图将
intogeid
作为第一个插入值,然后从数据库中提取第二个值,在这种情况下,它将如下所示:

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

我不能完全确定我是否正确地编写了第二个,因为我无法测试它,但基本上,它涉及到将您的亲密ID变量从SELECT语句中分离出来,如果它不在数据库表中。

仔细查看
strpropsdescription
。它是否以
结尾?
?最后的“额外”语句“引号看起来就像是在错误消息中SELECT语句开头打开的结束引号。@MattGibson很好!只是意味着现在还有别的问题!谢谢你!我不明白为什么这个问题会被否决。用户实际上是在从JComboBox中选择要输入的值,这样就不会太危险了!检查了打印的内容,它是正确的,结尾没有撇号,仍然值得对您的输入进行清理,因为未来的案例总是出现在列表中的“O'Malley公司血压监测仪”中:)@MattGibson对此无可争辩,这种方式正适合我现在需要做的!用户从JComboBox中选择值,该对话框显示另一列的值列表,此处没有原始用户输入。请参阅下面的帖子,以及我原始问题的最后一行。这听起来是忽视最佳实践的一个很好的理由;)老实说,真的没有理由不使用它们。Downvoter,有什么评论吗?还是我又让人在网络上发疯了?@Peddler-我没想到你是;)发生了。。。我有时会伤害人们的感情,他们会随便找个帖子投反对票。