当前位置: 首页 > 知识库问答 >
问题:

JDBC限制占位符更新语句失败的解决方法

连翰
2023-03-14

我正在实现一种模式来绕过JDBC的限制。对于准备好的语句,JDBC将占位符的数量限制为2100。为了解决这个问题,我使用了一个包含2100个值的xml字符串,并在SQL Server端使用函数tf_splitxml对其进行解析。我这样做是为了使用准备好的语句的~4个Java方法。

这个tf_splitxml只构造一个包含所有值的列“令牌”。所以一个xml字符串:

'<node><value>1</value><value>2</value></node>' 

将转换为包含两行的列,值为1和2。

对于选择语句,这种模式看起来很好,但是对于更新语句,这种模式就失败了。以下是一般模式:

declare @xml xml; set @xml = ?; --Replaced with xml string in PreparedStatement

update tableX
...
where ids in (select token from tf_splitxml(@xml));

它告诉我,当将nvarchar值转换为数据类型int时,转换失败了。[对于上面的xml字符串]奇怪的是,如果我提取由预准备语句设置的查询,我可以在SQL服务器中完美地运行它!

我的想法:

  1. 在这4个方法中,有3个使用这个xml模式;这3个都是选择语句,使用的是执行查询()。第4个失败的方法是更新语句,使用的是执行更新()。也许问题与准备好的语句预编译sql的方式有关?

我尝试过的事情:

>

  • 我创建了一个表,可以持久化从tf_splitxml生成的标记。对于失败的方法,在JDBC抛出错误之前,永远不会调用tf_splitxml。

    在Java方面,我使用ps.setString(index,convertToXML(idsArray))。这适用于前3种方法,即使my@xml不是字符串(它被声明为xml变量)。我尝试将其切换到SQLXML对象,但没有成功。我仍然得到同样的3/4方法正常工作。

    我可以在SQL Server编辑器中直接运行所有准备好的查询。

    我最诚挚的谢意(提前)

  • 共有1个答案

    柳羽
    2023-03-14

    代码看起来很疯狂,看看我的ChunkWorkTemplate。下面是一个简单的例子:

    public void delete(final List<Integer> employeeIds) {
      new ChunkWorkTemplate<Integer>(50, employeeIds) {
        protected void executeOnChunk(List<Integer> chunk) {
          Session session = getSession();
          Query query = session.createSQLQuery("delete from Employee where employeeId in (:employeeIds)");
          query.setParameterList("employeeIds", chunk);
          query.executeUpdate();
        }
      }.execute();
    }
    

    请注意,模板的第一个参数是块大小,您可以将其设置为任意值。基本上,它会将输入集合分块,并分块执行正文。所以在上面的例子中,如果你有207个员工ID,区块大小为50,你将有5个区块(507)。我写这篇文章就是为了解决你面临的问题。希望这有帮助。

     类似资料:
    • 本文向大家介绍解决TensorFlow程序无限制占用GPU的方法,包括了解决TensorFlow程序无限制占用GPU的方法的使用技巧和注意事项,需要的朋友参考一下 今天遇到一个奇怪的现象,使用tensorflow-gpu的时候,出现内存超额~~如果我训练什么大型数据也就算了,关键我就写了一个y=W*x…显示如下图所示: 程序如下: 出错提示: 占用的内存越来越多,程序崩溃之后,整个电脑都奔溃了,因

    • 问题内容: $pageMin = (($page * 10)-10); 似乎占位符不适用于LIMIT … 当我将pageMin连接起来时,例如: 甚至 使用占位符,它不会返回任何结果,为什么? 谢谢你的帮忙。 问题答案: 当您将参数数组传递给它们时,它们将被视为字符串,并且limit是一个int值。只需将bindValue与int类型一起使用即可。

    • 本文向大家介绍android studio更新gradle错误构建项目失败的解决方法,包括了android studio更新gradle错误构建项目失败的解决方法的使用技巧和注意事项,需要的朋友参考一下 一、版本错误 对应版本,修改gradle version,和plusing version两个地方修改gradle version,和plusing version的方法有两种,一种是在 proj

    • 本文向大家介绍Android bindservice失败解决方法,包括了Android bindservice失败解决方法的使用技巧和注意事项,需要的朋友参考一下 Android bindservice失败解决方法 现象: 相同的代码以前使用一直很正常,但最近在项目中使用却一直绑定失败,bindservice返回false。 原因: 使用了TabActivity, TabActivity里的子Ac

    • 本文向大家介绍clipboard.js在移动端复制失败的解决方法,包括了clipboard.js在移动端复制失败的解决方法的使用技巧和注意事项,需要的朋友参考一下 1.前沿 一句话介绍下clipboard.js:实现了纯 JavaScript (无 Flash)的浏览器内容复制到系统剪贴板的功能。 在项目中使用clipboard.js插件去实现点击按钮,复制一段网址到剪切板的功能。功能做好后,一开

    • 当需要更新多行和多列时,使用带有ON DUPLICATE KEY UPDATE子句的占位符时,我很难找到正确的语法。 下面的示例是如何对多行执行简单的Insert命令。那个“?”占位符将替换为数组值。 但是,如果我想在重复密钥更新中使用,我该怎么做呢?我发现的各种示例似乎都表明,我们必须显式地显示每个键=值对,这排除了使用“”的可能性占位符。