Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.SQLException:参数数目错误错误_Java_Sql_Jdbc_Insert - Fatal编程技术网

java.sql.SQLException:参数数目错误错误

java.sql.SQLException:参数数目错误错误,java,sql,jdbc,insert,Java,Sql,Jdbc,Insert,我试图通过java将数据插入SQLServer中的表中。 第一个是ID,第二个是nvarchar名称,第三个是xml类型(我将其作为字符串插入) 我有一个db管理器类,它管理查询执行本身(包括到db的连接) 用于插入的代码: stmt = String.format("INSERT INTO [dbo].[WorkflowFull] ([ID], [Name], [Workflow]) VALUES (%d, N'%s', N'%s')", workflowID, fileNameForDB,

我试图通过java将数据插入SQLServer中的表中。 第一个是ID,第二个是nvarchar名称,第三个是xml类型(我将其作为字符串插入)

我有一个db管理器类,它管理查询执行本身(包括到db的连接)

用于插入的代码:

stmt = String.format("INSERT INTO [dbo].[WorkflowFull] ([ID], [Name], [Workflow]) VALUES (%d, N'%s', N'%s')", workflowID, fileNameForDB, fileContent);
        try{
            dbManager.insert(stmt);
        } catch (SQLException e){
            System.out.println("Problem adding workflow " + fileName + " to DB");
            e.printStackTrace();
            continue;
        }
我得到的错误是:

java.sql.SQLException:参数数目错误:应为3,但已为0查询:插入[dbo]。[WorkflowFull]([ID],[Name],[Workflow])值(1,N'testWorkflow',N'
“)参数:[]
位于org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:392)
位于org.apache.commons.dbutils.QueryRunner.insert(QueryRunner.java:610)
位于org.apache.commons.dbutils.QueryRunner.insert(QueryRunner.java:516)
位于org.bgu.ddms.utils.dbutils.DbManager.insert(DbManager.java:165)
位于org.bgu.ddms.cnc.cnc.populateWorkflows(cnc.java:289)
位于org.bgu.ddms.cnc.cnc.populateDB(cnc.java:244)
位于org.bgu.ddms.cnc.Main.Main(Main.java:108)
当我在SSMS中运行完全相同的查询时,一切正常

第一个是ID,第二个是nvarchar名称,第三个是 xml类型(我将其作为字符串插入)

您的方式可能会导致像现在这样的语法错误,但要避免这种情况,您必须改用,例如:

String query = "INSERT INTO [dbo].[WorkflowFull] ([ID], [Name], [Workflow]) VALUES (?, ?, ?)");
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, workflowID);
preparedStatement.setString(2, fileNameForDB);
preparedStatement.setString(3, fileContent);

这是什么意思?`N'%s'`?旁注:我不是您正在使用的框架方面的专家(
[dbo]
等。看起来不像是好的旧sql),但是
String.format(…)
看起来很容易受到sql注入的攻击。决不应将可能不受信任的值直接连接到查询中。由于您使用了JDBC标记,我建议您改用
PreparedStatement
(或者以您的框架所公开的方式)。结合我上面的评论,我怀疑将未扫描的XML(特别是因为它本身包含查询)直接输入查询字符串是您遇到的问题。使用
PreparedStatement
调用
setParameter(3,yourXmlString)
而不是将其连接到query.YCF_L,字符串前的N表示它是一个nvarchar(Unicode),而不仅仅是一个varchar,因此,引号前的N是可以的。你可以检查我的答案@ZionsofI,我会对
PreparedStatement
更感兴趣,因为这会纠正问题(setXXX方法会逃逸该值),而且更安全。你说@AxelH是什么意思?我已经举了一个例子,说明如何使用PreparedStatement?您想让我将
setInt
更改为
setXXX
还是什么?好吧,我在您的编辑过程中添加了注释以添加示例,所以这正是我的意思;)切换到prepared语句(即使它有点覆盖连接的当前管理)修复了它。谢谢<代码>N'…'表示NVARCHAR文本,请参见