我试图通过java将数据插入到SQL Server的表中。 第一个是ID,第二个是nvarchar名称,第三个是xml类型(我将其作为字符串插入)。
我有一个db manager类来管理查询执行本身(包括与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: Wrong number of parameters: expected 3, was given 0 Query: INSERT INTO [dbo].[WorkflowFull] ([ID], [Name], [Workflow]) VALUES (1, N'testWorkflow', N'<Workflow name="NetMonitorTester" start="atomic">
<atomic name="atomic" startingPoint="monitor" hostType="PC" multiplicity="1">
<activity package="MonitorNetwork" name="monitor" input="null" stopCondition="never">
<filter query="regex:GET.+(.{10,})\1{10,}"/>
<resultQuery retrieve="SELECT * FROM PUBLIC.TCP_PACKETS"/>
</activity>
</atomic>
</Workflow>') Parameters: []
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:392)
at org.apache.commons.dbutils.QueryRunner.insert(QueryRunner.java:610)
at org.apache.commons.dbutils.QueryRunner.insert(QueryRunner.java:516)
at org.bgu.ddms.utils.dbutils.DbManager.insert(DbManager.java:165)
at org.bgu.ddms.cnc.CNC.populateWorkflows(CNC.java:289)
at org.bgu.ddms.cnc.CNC.populateDB(CNC.java:244)
at org.bgu.ddms.cnc.Main.main(Main.java:108)
当我在SSMS中运行完全相同的查询时,一切正常
答案 0 :(得分:2)
第一个是ID,第二个是nvarchar名称,第三个是 xml类型(我将其作为字符串插入)。
你的方式会导致语法错误,就像你现在一样,不好的是SQL Injection所以要避免这种情况,你必须改为使用PreparedStatement,例如:
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);