我遇到了一个奇怪的问题,如果我尝试将(“paramname”,false)绑定到数据库中的一个可为空的布尔值(sql位),我会收到以下错误:
org.jdbi.v3.core.statement.UnableToCreateStatementException: No argument factory registered for 'false' of qualified type org.jdbi.v3.core.argument.NullArgument [statement:"UPDATE dbo.TagValues SET BoolValue = :boolValue, NumericValue = :numericValue, StringValue = :stringValue WHERE TagID = :tagID", arguments:{positional:{}, named:{stringValue:NULL,tagID:17,numericValue:NULL,boolValue:false}, finder:[]}]
我使用的是mssql server 2017和jdbi 3。我的3个冒号参数boolvalue、numericvalue和stringvalue都可以为空。
奇怪的是,我正在对布尔值进行硬编码,这是唯一一个语句似乎会呕吐的示例。我已经附加了代码,带有冒犯的一行。对不起,线路长度提前了。
PreparedBatch batch = handle.prepareBatch("UPDATE dbo.TagValues SET BoolValue = :boolValue, NumericValue = :numericValue, StringValue = :stringValue WHERE TagID = :tagID");
active_sites.forEach(site -> site.getEntryPoints().forEach(entryPoint -> {
if(entryPoint.isGatewayResponding() && !entryPoint.hasError()){
entryPoint.getTiedTags().forEach(tag -> {
if (boolTypes.contains(tag.getType())) {
batch.bind("boolValue", tag.getValue().getValue()).bindNull("numericValue", Types.FLOAT).bindNull("stringValue", Types.VARCHAR).bind("tagID", tag.getIDX()).add();
}
else if (numericTypes.contains(tag.getType())) {
batch.bindNull("boolValue", Types.BIT).bind("numericValue", tag.getValue().getValue()).bindNull("stringValue", Types.VARCHAR).bind("tagID", tag.getIDX()).add();
}
else if (stringTypes.contains(tag.getType())) {
batch.bindNull("boolValue", Types.BIT).bindNull("numericValue", Types.FLOAT).bind("stringValue", tag.getValue().getValue()).bind("tagID", tag.getIDX()).add();
}
});
}
else {
entryPoint.getTiedTags().forEach(tag -> batch.bindNull("boolValue", Types.BIT).bindNull("numericValue", Types.FLOAT).bindNull("stringValue", Types.VARCHAR).bind("tagID", tag.getIDX()).add());
}
entryPoint.getErrorTags().stream().filter(tag -> tag.getType() == 33 || tag.getType() == 34 || tag.getType() == 35).forEach(tag -> {
if(Objects.nonNull(tag.getValue())) {
batch.bind("boolValue", tag.getValue().getValue()).bindNull("numericValue", Types.FLOAT).bindNull("stringValue", Types.VARCHAR).bind("tagID", tag.getIDX()).add();
}
else {
//TAG 17 FALLS INTO THIS CATEGORY, CONFIRMED BY PRINTLN. THIS IS THE OFFENDER.
batch.bind("boolValue", false).bindNull("numericValue", Types.FLOAT).bindNull("stringValue", Types.VARCHAR).bind("tagID", tag.getIDX()).add();
}
});
}));
更新:
jdbi:3.18.1 mssql jdbc驱动程序:9.2.1.jre15
完整堆栈跟踪:
org.jdbi.v3.core.statement.UnableToCreateStatementException: No argument factory registered for 'false' of qualified type org.jdbi.v3.core.argument.NullArgument [statement:"UPDATE dbo.TagValues SET BoolValue = :boolValue, NumericValue = :numericValue, StringValue = :stringValue WHERE TagID = :tagID", arguments:{positional:{}, named:{stringValue:NULL,tagID:17,numericValue:NULL,boolValue:false}, finder:[]}]
at org.jdbi.v3.core.statement.ArgumentBinder.factoryNotFound(ArgumentBinder.java:174)
at org.jdbi.v3.core.statement.ArgumentBinder.lambda$null$2(ArgumentBinder.java:141)
at java.base/java.util.Optional.orElseThrow(Optional.java:403)
at org.jdbi.v3.core.statement.ArgumentBinder.lambda$null$3(ArgumentBinder.java:141)
at org.jdbi.v3.core.statement.ArgumentBinder.lambda$null$4(ArgumentBinder.java:142)
at org.jdbi.v3.core.statement.ArgumentBinder$Prepared.lambda$prepareBinder$12(ArgumentBinder.java:230)
at org.jdbi.v3.core.statement.ArgumentBinder.lambda$wrapExceptions$6(ArgumentBinder.java:153)
at org.jdbi.v3.core.statement.ArgumentBinder$Prepared.lambda$null$13(ArgumentBinder.java:234)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at org.jdbi.v3.core.statement.ArgumentBinder$Prepared.lambda$prepareBinder$14(ArgumentBinder.java:234)
at org.jdbi.v3.core.statement.ArgumentBinder$Prepared.bindNamed(ArgumentBinder.java:240)
at org.jdbi.v3.core.statement.ArgumentBinder.bind(ArgumentBinder.java:60)
at org.jdbi.v3.core.statement.PreparedBatch.internalBatchExecute(PreparedBatch.java:204)
at org.jdbi.v3.core.statement.PreparedBatch.execute(PreparedBatch.java:108)
at app.dao.services.impl.EntryDaoService.updateTagValues(EntryDaoService.java:165)
at app.SCADA.updateTagValues(SCADA.java:215)
at app.SCADA.run(SCADA.java:93)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:831)
暂无答案!
目前还没有任何答案,快来回答吧!