【问题标题】:Size of access database increasing访问数据库的大小增加
【发布时间】:2016-02-19 08:45:33
【问题描述】:

我正在使用Access DB (2016)VB.net (4.5) 中创建应用程序,但有一个小问题。当我插入一条记录(例如,RichTextBox 变为 Byte())时,数据库的大小会增加。但是当我删除时,大小并没有减少(它保持不变)。因此,随着我插入和删除记录,数据库以 MB 为单位增长。

我发现当您重新启动 PC 时,数据库已释放空间。有什么问题?我该如何解决这个问题??

PD:如果我的 DB 访问类,我正在执行所有 .close () 和 .Dispose ()。

【问题讨论】:

  • 大小限制为 2 GB(2010 版本 - 可能在 2016 年更改)。当您达到该限制时,您可以使用您的 Access 和“compact&repair”。这将恢复您的磁盘空间(当然,您可以在达到限制之前定期执行压缩任务)。尽管在 C# 中,您会发现此链接很有用:stackoverflow.com/questions/1866421/…
  • 我对限制没有问题。我说的是一些测试记录 (2-3 MB)

标签: vb.net ms-access


【解决方案1】:

是的,这是 Access 的一项功能。更一般地说,几乎任何数据库系统或文件系统。

数据库扩展以保存新记录。当您将记录标记为已删除时,直到稍后才会回收或释放空间。

在我使用的 Access 版本中,当您关闭 Access 时,数据库(可选)被压缩。如果您使用的是 com 对象或 .net 对象,而不是 MSAccess,则取决于您使用适当的方法来压缩数据库。

如果您的文件系统未显示正确的文件大小,则可能是 (1) 您的 shell 没有按预期更新的问题,或者 (2) 您没有正确释放文件。

删除后的数据库大小是一个常见问题。另见Wouldn't MS Access(.mdb) file size reduce after deleting the content of database?

【讨论】:

  • 我明白了...我在压缩中看到的“问题”是通常会创建一个新文件(使用压缩数据库)最终会替换旧文件。是否可以压缩同一个文件?数据库是多用户的。
【解决方案2】:

你是按照https://msdn.microsoft.com/en-us/library/bb208950.aspx提交数据库吗

COMMIT [TRANSACTION | WORK]

可以使用

【讨论】:

    【解决方案3】:

    我没有使用交易。 但是,我不确定这是否有任何关系,因为当我重新启动我的电脑时,数据库是好的。

    Public Function ejecutarUpdate(ByVal query As String, ByVal devolverId As Boolean, ByRef id As Integer) As Integer
        Dim numRegistros As Integer = 0
    
        Try
            conexion = New OleDbConnection(cadenaConexion)
            conexion.Open()
            comando = New OleDbCommand(query, conexion)
            numRegistros = comando.ExecuteNonQuery()
    
            If devolverId Then
                comando.CommandText = "Select @@Identity"
                id = CInt(comando.ExecuteScalar())
            End If
        Catch oleDbException As OleDbException
            If oleDbException.Errors(0).SQLState = "3022" Then
                Throw New Exception(COD_ERROR_PK_UK) ' Restricción de PK/UK
            Else
                Throw oleDbException
            End If
        Catch exception As Exception
            Throw exception
        Finally
            liberarDB()
        End Try
    
        Return numRegistros
    End Function
    
    Private Sub liberarDB()
        If conexion IsNot Nothing AndAlso conexion.State = ConnectionState.Open Then
            conexion.Close()
            conexion.Dispose()
            conexion = Nothing
        End If
    
        If comando IsNot Nothing Then
            comando.Dispose()
            comando = Nothing
        End If
    
        If adaptador IsNot Nothing Then
            adaptador.Dispose()
            adaptador = Nothing
        End If
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2013-09-10
      • 1970-01-01
      相关资源
      最近更新 更多