微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Microsoft Access:错误消息行大小太大

如何解决Microsoft Access:错误消息行大小太大

我不知道我的访问数据库的行大小有任何限制,但是在尝试更新超过 10 个字符的记录时,我收到以下错误消息。我正在通过 DBeaver 使用以下 sql 命令:

UPDATE 'amenities' 
SET [Bar opening Times]="12345678901"
WHERE HostelKey="WOMLON";

并收到以下错误消息:

sql 错误 [15000] [15000]: UCAExc::5.0.1 Row size 4061 太大 (Db=womdb.accdb;Table=amenities)

详细错误代码

org.jkiss.dbeaver.model.sql.DBsqlException: sql 错误 [15000] [15000]: UCAExc::5.0.1 行大小 4061 太大 (Db=womdb.accdb;Table=amenities) 在 org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:133) 在 org.jkiss.dbeaver.ui.editors.sql.execute.sqlQueryJob.executeStatement(sqlQueryJob.java:509) 在 org.jkiss.dbeaver.ui.editors.sql.execute.sqlQueryJob.lambda$0(sqlQueryJob.java:440) 在 org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:168) 在 org.jkiss.dbeaver.ui.editors.sql.execute.sqlQueryJob.executeSingleQuery(sqlQueryJob.java:427) 在 org.jkiss.dbeaver.ui.editors.sql.execute.sqlQueryJob.extractData(sqlQueryJob.java:812) 在 org.jkiss.dbeaver.ui.editors.sql.sqlEditor$QueryResultsContainer.readData(sqlEditor.java:3220) 在 org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:121) 在 org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:168) 在 org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:119) 在 org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:4516) 在 org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:105) 在 org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) 引起 作者:net.ucanaccess.jdbc.ucanaccesssqlException:UCAExc::5.0.1 行 大小 4061 太大 (Db=womdb.accdb;Table=amenities) 在 net.ucanaccess.jdbc.ucanaccessStatement.execute(ucanaccessStatement.java:159) 在 org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.execute(JDBCStatementImpl.java:327) 在 org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:130) ... 12 更多 引起:net.ucanaccess.jdbc.ucanaccesssqlException: UCAExc::5.0.1 行大小 4061 太大 (Db=womdb.accdb;Table=amenities) 在 net.ucanaccess.jdbc.ucanaccessConnection.commit(ucanaccessConnection.java:212) 在 net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:273) 在 net.ucanaccess.jdbc.Execute.execute(Execute.java:44) 在 net.ucanaccess.jdbc.ucanaccessStatement.execute(ucanaccessStatement.java:157) ... 14 更多 引起:net.ucanaccess.jdbc.ucanaccesssqlException: UCAExc::5.0.1 行大小 4061 太大 (Db=womdb.accdb;Table=amenities) 在 net.ucanaccess.jdbc.ucanaccessConnection.flushIO(ucanaccessConnection.java:360) 在 net.ucanaccess.jdbc.ucanaccessConnection.commit(ucanaccessConnection.java:205) ... 17 更多 引起:net.ucanaccess.jdbc.ucanaccesssqlException: UCAExc::5.0.1 行大小 4061 太大 (Db=womdb.accdb;Table=amenities) 在 net.ucanaccess.commands.CompositeCommand.persist(CompositeCommand.java:96) 在 net.ucanaccess.jdbc.ucanaccessConnection.flushIO(ucanaccessConnection.java:323) ... 18 更多 原因: com.healthmarketscience.jackcess.InvalidValueException:行大小 4061 太大 (Db=womdb.accdb;Table=amenities) 在 com.healthmarketscience.jackcess.impl.TableImpl.updateRow(TableImpl.java:2549) 在 com.healthmarketscience.jackcess.impl.CursorImpl.updateCurrentRow(CursorImpl.java:286) 在 net.ucanaccess.commands.UpdateCommand.persist(UpdateCommand.java:192) 在 net.ucanaccess.commands.UpdateCommand.persistCurrentRow(UpdateCommand.java:125) 在 net.ucanaccess.commands.CompositeCommand.persist(CompositeCommand.java:87) ... 19 更多

我怎样才能避免这个错误? 非常感谢。

解决方法

Access 数据库引擎将行数据以 4KB 页存储在磁盘上。一行不能跨越超过一页,因此该行中实际数据的大小不能超过 4000 字节。我们可以定义一个最大容量大于4000字节的表,比如这张表的最大理论长度为20 * 255 = 5100个字符

CREATE TABLE row_length (
txt01 TEXT(255),txt02 TEXT(255),txt03 TEXT(255),txt04 TEXT(255),txt05 TEXT(255),txt06 TEXT(255),txt07 TEXT(255),txt08 TEXT(255),txt09 TEXT(255),txt10 TEXT(255),txt11 TEXT(255),txt12 TEXT(255),txt13 TEXT(255),txt14 TEXT(255),txt15 TEXT(255),txt16 TEXT(255),txt17 TEXT(255),txt18 TEXT(255),txt19 TEXT(255),txt20 TEXT(255))

并且我们可以插入实际大小不超过 4000 字节的行(在本例中为 2000 个字符,因为 Unicode 字符可能需要 2 个字节)

Sub so67077855()
    Dim cdb As DAO.Database
    Set cdb = CurrentDb
    Dim rst As DAO.Recordset
    Set rst = cdb.OpenRecordset("row_length",dbOpenTable)
    Const string_length = 100
    Dim i As Long
    rst.AddNew
    For i = 1 To 20
        Dim field_name As String
        field_name = "txt" & Format(i,"00")
        rst.Fields(field_name).Value = String(string_length,"x")
    Next
    rst.Update
End Sub

但是如果我们将每个字符串的长度更改为 Const string_length = 101 并尝试运行我们得到的代码

运行时错误“3047”:记录太大。

请注意,“长文本”(又名“备忘录”)字段可以超过 2000 个字符,因为记录仅包含指向文本的指针(在另一个结构中),而不是文本本身。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。