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

SQLite JDBC驱动程序未实现UpdateString

伯博
2023-03-14

我有一个表PERSON超过5百万行,我需要更新字段NICKNAME在每一个基于字段NAME在同一个表内。

ResultSet rs = statement.executeQuery("select NAME from PERSON");
while(rs.next())
{
    // some parsing function like:
    // Nickname = myparsingfunction(rs.getString("NAME"));
    rs.updateString( "NICKNAME", Nickname );
    rs.updateRow();
}

但是我得到了这个错误:

不是由SQLite JDBC驱动程序实现的

我正在使用sqlite-jdbc-3.8.11.2。jar下载地址:https://bitbucket.org/xerial/sqlite-jdbc/downloads.

我知道我可以使用以下SQL查询:

statement.executeUpdate("update PERSONS set NICKNAME = Nickname where ID = Id");

但这需要很长时间,我知道更新ResultSet会更快。那么,我有什么选项来以最快的方式更新表呢?还有其他司机吗?我应该搬出Java吗?

使现代化

我能够使用下面的语法找到一个快速的解决方案。CASEEND之间的块是我在执行SQL查询之前构建的连接字符串,因此我可以一次发送所有更新。

update  PERSON
set     NICKNAME= case ID                        
                        when 173567 then 'blabla'
                        when 173568 then 'bleble'
                        ...
                        when 173569 then 'blublu'
                    end
where ID in (173567, 173568, 173569)

共有1个答案

惠翰藻
2023-03-14

正如您所遇到的,SQLite JDBC驱动程序目前不支持updateString操作。这可以在该驱动程序的源代码中看到。

我能想到三个选择:

>

  • 正如您在问题中所述,您可以选择此人的姓名和ID,然后根据其ID更新此人。这些更新可以成批完成(使用PreparedStatement.addBatch())以提高性能(教程)
  • 在纯SQL中实现方法myparsingfunction,这样查询就可以变成updatepersonsetnickname=some_函数(NAME)
  • 创建一个用Java实现的用户定义函数(使用org.sqlite.function),并在SQL中调用它。示例,摘自此答案:

    Function.create(db.getConnection(), "getNickName", new Function() {
        protected void xFunc() throws SQLException {
            String name = value_text(0);
            String nickName = ...; // implement myparsingfunction here
            result(nickName);
        }
    });
    

    并像这样使用:updatepersonsetnickname=getNickName(NAME)

    SQLite不支持存储过程,因此该选项不在表中。

    我不确定这些选项中的哪一个会提供最好的性能(当然使用纯SQL会更快,但这可能不是一个可行的解决方案)。您应该对每个解决方案进行基准测试,以找到适合您的解决方案。

  •  类似资料:
    • 我使用硒网格3.3.1在mac OS Sierra和运行远程命令从窗口(使用C#与硒3.3.1)。当我试图使用预期条件时。ElementToBeClickable我得到以下异常: 系统捕获到NotImplementedException HResult=-2147467263消息=生成信息:版本:'3.3。1',修订版:'5234b32',时间:'2017-03-10 09:04:52-0800'

    • 我正在尝试做一个登录代码。快速的解释是,我想在deatils页面中显示帐户的详细信息,但我不能这样做,因为错误总是显示该函数没有在JDBC驱动程序中实现

    • 问题内容: 我有一个包含用户信息的数据库,我想创建一个公共静态变量,以便在任何给定时间返回数据库整数,而不必为每个整数都做一个空,但这给了我这个错误: 这是我的代码: 有人知道我在做什么错吗?我尝试使用Google的东西,但是更改代码将我从一个错误转移到了另一个错误…因此,我现在还不确定。 我正在运行JDBC驱动程序sqlite-jdbc-3.8.11.2.jar 问题答案: 未实现。我想你只是想

    • 在Eclipse BIRT数据资源管理器中为查询生成器添加JDBC数据库连接: 选择“查询生成器的JDBC数据库连接” 就这样。我可以使用此数据源来使用数据集。 下一个。 我希望使用更灵活的“JDBC数据源”,而不是以前成功使用的“查询生成器的JDBC数据库连接”。哦,我看到MySQL没有驱动程序类-Derby和Sample只有两个默认条目。 似乎JDBC驱动程序的有效注册没有添加(或注册?)司机

    • 2:在odbcDriverConnect(con,...)中:ODBC连接失败 如果在64位R(R console或Rstudio)中运行,将返回以下错误: 警告消息:1:在odbcDriverConnect(con,...)中:[RODBC]错误:状态IM003,代码160,由于系统错误126:找不到指定的模块,无法加载消息指定的驱动程序。(Microsoft Access驱动程序(*.mdb,

    • 我无法运行脚本,并显示消息:驱动程序信息:驱动程序。.