C#中如何解决sqlite数据表/记录删除后数据库内存不变的问题

在C#中使用sqlite数据库时发现,删除了数据表或大量数据后,数据库的并不会变小。

这是因为数据库中删除大量数据后,会留下原来的数据空间(空闲数据页),数据库默认不会自动释放这些空间。可以通过"VACUUM"命令释放空间。

网上查到两种方法(手动/自动):

1、手动释放空间

先写一个执行sql语句的函数:

 1 private void ExecuteSql(string sDbPath, string sqlStr)
 2 {
 3     using (SQLiteConnection conn = new SQLiteConnection("data source = " + sDbPath))
 4     {
 5         using (SQLiteCommand cmd = new SQLiteCommand())
 6         {
 7             cmd.Connection = conn;
 8
 9             conn.Open();
10             cmd.CommandText = sqlStr;
11             cmd.ExecuteNonQuery();
12
13             conn.Close();
14         }
15     }
16 }

在删除数据表/大量数据后,调用上述函数(dbPath为数据库的地址)。

ExecuteSql(dbPath, "VACUUM");

2、设置数据库为自动释放空间

当数据库中无数据表时,设置其属性:

ExecuteSql(dbPath, "PRAGMA auto_vacuum = 1;");

测试了一下发现效果也挺好的。

比较两种方法,自动更方便。但是需要注意的是,在进行频繁的插入、更新、删除操作时,数据库会产生大量的内存碎片。自动释放空间的方法只能释放空闲数据页,但是并不会对内存碎片进行整理,在这个过程中反而会产生额外的内存碎片;而手动方式可以同时释放空闲空间和整理内存碎片。

时间: 2024-10-10 07:51:59

C#中如何解决sqlite数据表/记录删除后数据库内存不变的问题的相关文章

在android中如何查看sqlite数据表结构,以及data文件打不开问题

1.root你的手机 2.cmd进入DOS界面,并且cd 转换目录到AndroidSDK\platform-tools中 3.输入adb shell 4.输入su,进入root权限,此时$变为#,输入ls命令可以看到手机目录 5.输入chomd 777 /data/data    这一步的作用是改变目录/data/data的权限,使其可以打开 6.在eclipse中找到 DDMS,它在 打开即可进入目录 7.此时你想打开哪个应用的目录,仿照第五步进行修改权限,进入你所要求的目录 8.点击红框按钮

安卓中实现对SQLITE数据表的增删改查

直接上代码 MainActiviy.java package com.example.sqllitcache; import android.app.Activity; import android.app.AlertDialog; import android.content.ContentValues; import android.content.DialogInterface; import android.database.Cursor; import android.database

数据库表记录删除该怎么解决

[故障类别] (一)故障类型:数据库表记录删除 (二)典型特征: 1.数据表中无任何数据或只有部分数据 2.客户端无法查询到完整的信息 (三)损坏程度星级评价:★★★★ [解决方案] (一)恢复流程 1.检测流程: (1)使用磁盘编辑器对数据文件MYD进行分析: (2)判断表记录丢失的可能原因. 2.实施流程: (1)将损坏的数据库文件进行备份: (2)对数据库文件进行分析,判断丢失的可能原因: (3)针对不同的丢失原因,使用自主开发的软件进行数据恢复: (4)将数据插入原数据库,对数据库做完整

聊聊关于数据库表记录删除都有哪些解决方式

[故障类别](一)故障类型:数据库表记录删除(二)典型特征:1.数据表中无任何数据或只有部分数据2.客户端无法查询到完整的信息 (三)损坏程度星级评价:★★★★[解决方案](一)恢复流程1.检测流程:(1)使用磁盘编辑器对数据文件MYD进行分析:(2)判断表记录丢失的可能原因.2.实施流程:(1)将损坏的数据库文件进行备份:(2)对数据库文件进行分析,判断丢失的可能原因:(3)针对不同的丢失原因,使用自主开发的软件进行数据恢复:(4)将数据插入原数据库,对数据库做完整性检测.3.验收流程:(1)

Oracle生成查询包括对应于所有数据表记录语句中指定的字段名

应用:已知的字段名,表中的所有数据的查询数据库中包含的所有数据表的字段名 操作方法:指定字段名,用户数据库表,它可以执行以下查询 --Oracle生成查询包括对应于所有数据表记录语句中指定的字段名 declare mycolumnname VARCHAR(255):='userid';--定义要查询的字段名变量,执行前改动成您要查询的字段名myownername VARCHAR(255):='system';--定义要查询的数据库username变量,执行前改动成您要查询的数据库username

SQLITE数据表主键设置Id自增方法

SQLITE数据表主键设置Id自增方法 标签: sqliteintegerinsertnulltableapi 2010-01-12 08:39 35135人阅读 评论(8) 收藏 举报  分类: SQL(11)  版权声明:本文为博主原创文章,未经博主允许不得转载. 搞定了一个困扰许久的问题,原来sqlite中的主键也是可以设置为自增的:)方法就是声明为 INTEGER PRIMARY KEY 的字段可以自动增加.    网上查到资料说,从 SQLite 的 2.3.4 版本开始,如果将一个表

Oracle生成查询包含指定字段名对应的所有数据表记录语句

应用场合:已知字段名字,查询数据库中所有数据表中包含该字段名的所有数据表 操作办法:指定字段名,数据库表用户,执行下面查询语句即可 --Oracle生成查询包含指定字段名对应的所有数据表记录语句 declare mycolumnname VARCHAR(255):='userid';--定义要查询的字段名变量,运行前修改成您要查询的字段名myownername VARCHAR(255):='system';--定义要查询的数据库用户名变量,运行前修改成您要查询的数据库用户名mystring NV

Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)

应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create or replace type splitTable is table of varchar2(100); 2.创建函数fn_splitString(功能是将字符串分割成多条记录)--测试语句select * from table(fn_splitString('ernanyinv','nan'))

SQLite数据表和视图

一.创建数据表: 该命令的语法规则和使用方式与大多数关系型数据库基本相同,因此我们还是以示例的方式来演示SQLite中创建表的各种规则.但是对于一些SQLite特有的规则,我们会给予额外的说明.注:以下所有示例均是在sqlite自带命令行工具中完成的. 1). 最简单的数据表: sqlite> CREATE TABLE testtable (first_col integer); 这里需要说明的是,对于自定义数据表表名,如testtable,不能以sqlite_开头,因为以该前缀定义的表名都用于