问题描述
我遇到了一个奇怪的问题,如果我尝试将 ("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,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",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",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.getIDX()).add();
}
else {
//TAG 17 FALLS INTO THIS CATEGORY,CONFIRMED BY PRINTLN. THIS IS THE OFFENDER.
batch.bind("boolValue",false).bindNull("numericValue",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,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)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)