我正在使用VB.net (4.5)
在Access DB (2016)
中创建一个应用程序,但是有一个小问题。当我插入记录(例如,RichTextBox变为Byte())时,数据库的大小会增加。但是当我删除时,大小不会减少(它保持不变)。因此,当我插入和删除记录时,数据库正以MB为单位增长。
我发现当你重新启动电脑时,数据库已经释放了空间。问题是什么?我该如何解决这个问题?
PD:我做了所有.close()和.Dispose()应该是我的数据库访问类。
答案 0 :(得分:1)
是的,这是Access的一项功能。更一般地说,几乎任何数据库系统或文件系统。
数据库扩展为保存新记录。将记录标记为已删除时,空格不会被回收或释放,直到稍后。
在我使用的Access版本中,当您关闭Access时,(可选)压缩数据库。如果您使用的是com对象或.net对象而不是MSAccess,则可以使用适当的方法来压缩数据库。
如果您的文件系统没有显示正确的文件大小,那么(1)shell的问题没有按预期更新,或者(2)您没有正确释放文件。< / p>
删除后的数据库大小是一个常见问题。另请参阅Wouldn't MS Access(.mdb) file size reduce after deleting the content of database?
答案 1 :(得分:0)
答案 2 :(得分:0)
我没有使用交易。 但是,我不确定这是否有任何关系,因为当我重新启动电脑时,数据库正常。
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