问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Access数据库损坏怎样用c#程序来修复

发布网友 发布时间:2022-04-11 19:09

我来回答

2个回答

懂视网 时间:2022-04-11 23:30

由于单位业务需要,搭建一台服务器专门用来做数据存储。因为数据流很小,遂采用access库作为DB。开始还好,但是后来发现access数据库有一问题,就是表空间会随着使用越来越大,哪怕表里没有数据。因为表中单次存放的内容是很小的,每隔几分钟会全删除然后再

由于单位业务需要,搭建一台服务器专门用来做数据存储。因为数据流很小,遂采用access库作为DB。开始还好,但是后来发现access数据库有一问题,就是表空间会随着使用越来越大,哪怕表里没有数据。因为表中单次存放的内容是很小的,每隔几分钟会全删除然后再写入,所以表也会越来越大啊!

开始是用VB写的一个压缩软件,因为是M$自家的语言嘛,自然对Office系列支持很好,后来发现ruby中也可以通过Win32ole访问Jet引擎,为何不用ruby来写呢?因为是以前写的代码神马都用class来搞,稍显夸大,但效果还好。

#hb table write by hopy 2012 
require 'win32ole'
require 'oci8'

class Hb
 def initialize
 @oci = OCI8.new("xxx","***","xxx")
 end
 
 def open
 unless @acs
 conn_str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=#{Dir.pwd}/hb.mdb"
 #conn_str = "driver={SQL Server};database=xxx;server=localhost,1433;uid=sa;pwd=sa"
 @acs = WIN32OLE.new('ADODB.Connection')
 @acs.Open(conn_str)
 end
 end
 
 def close
 (@acs.Close;@acs=nil) if @acs
 end
 
 def cls
 self.open
 sql = "DELETE * from InTable";@acs.Execute(sql)
 sql = "DELETE * from OutTable";@acs.Execute(sql)
 end
 
 def zip
 start = Time.now
 self.close
 jet = WIN32OLE.new('JRO.JetEngine')
 path = Dir.pwd+"/hb.mdb"
 new_path=Dir.pwd+"/hb_ziped.mdb"
 File.delete(new_path) if File.exist?(new_path)
 sp = "Provider=Microsoft.Jet.OLEDB.4.0"
 ss = sp+";Data Source="+path
 sd = sp+";Data Source="+new_path
 jet.CompactDatabase(ss,sd)
 File.delete(path)
 File.rename(new_path,path)
 puts "access ziped , take #{Time.now - start} s"
 end
 
 def sync
 self.cls
 self.open
 
 zb = [64981,57520]
 
 i = 0;start = Time.now
 ret = @oci.exec('select * from DBO.DPXS_ARRIVAL') do |r|
 next if r[7].unpack("v*") != zb
 
 zt = if r[24] == "Arrived" 
 r[23]
 elsif r[25]
 r[25]
 else
 r[23]
 end
 
 tm = if r[12]
 r[12]
 elsif r[11]
 r[11]
 else
 r[10]
 end
 
 @acs.Execute("INSERT INTO InTable VALUES('#{r[0]}','#{tm}','#{r[13]}','#{zt}')");i+=1
 end
 	puts "sync #{i} arrival flights , take #{Time.now - start} s"
 
 i = 0;start = Time.now
 ret = @oci.exec('select * from DBO.DPXS_DEPARTURE') do |r|
 next if r[7].unpack("v*") != zb
 
 tm = if r[13]
 r[13]
 elsif r[12]
 r[12]
 else
 r[11]
 end
 
 @acs.Execute("INSERT INTO OutTable VALUES('#{r[0]}','#{tm}','#{r[14]}','#{r[27]}')");i+=1
 end
 puts "sync #{i} departure flights , take #{Time.now - start} s"
 end
end

INTERVAL_sec = 10
hb = Hb.new
t = 0
loop do 
 sleep(INTERVAL_sec);t+=INTERVAL_sec
 hb.sync
 (hb.zip;t=0) if t >= 60
 #t=0 if t >= 60
end

热心网友 时间:2022-04-11 20:38

用C#压缩和修复Access数据库
介绍
下面这段C# 代码可以用来压缩和修复Access数据库,不管它是一个简单的".mdb"ACCESS数据库还是一个".mdw"网络共享数据库,这个过程和你在用MS Access应用程序中使用的"工具-数据库实用工具-压缩和修复"时执行的操作完全一样.实例代码使用了"迟绑定"(运行中在内存中建立COM对象),这样就不需要在工程中加入COM引用了,也不需要在PC上安装MS Access应用程序.只需要一个Jet引擎(Jet引擎包含在MDAC安装包中,在Windows NT4以后的版本中,系统已经自带了这个引擎).

C#操作ACCESS数据库的背景
不知你是否也厌烦了在工程中加入复杂的COM库引用,但我相信这个纯.NET代码将省去额外的交互操作, RCWs和COM引用.基本上,由于系统中安装的Microsoft类库的不同(例如:MS Office Object Library 9,10,11等等),我们也不知道用户PC中安装的Office版本,所以我们要通过ProgID来访问COM对象,而不能用CLSID.例如,当调用"Excel.Application",时,得到的是Excel,而不管系统中安装MS Office的版本,当在代码中加入"MS Excel 10 Object library"引用时,其实只是给应用程序加入了一个非常受*的功能.所以我们使用System.Reflection和迟绑定.
1. 实例代码
只需调用CompactAccessDB函数即可压缩和修复目标数据库.

2. 参数:
connectionString – 用来连接到Access数据库.
mdwfilename –要压缩的MDB文件的全名(路径+文件名).
由于Jet引擎的*,执行此方法压缩Access数据库会把结果生成为一个新文件,所以我们要还需要把这个新的Access文件拷贝到目的位置覆盖原来未压缩文件.

当调用此方法时请确认被压缩数据库无打开的连接.
/**//// MBD compact method (c) 2004 Alexander Youmashev
/// !!IMPORTANT!!
/// !make sure there's no open connections
/// to your db before calling this method!
/// !!IMPORTANT!!
///
///
connection string to your db
/**////
FULL name
/**//// of an MDB file you want to compress.
public static void CompactAccessDB(string connectionString, string mdwfilename)
{
object[] oParams;

//create an inctance of a Jet Replication Object
object objJRO =
Activator.CreateInstance(Type.GetTypeFromProgID("JRO.JetEngine"));

//filling Parameters array
//cnahge "Jet OLEDB:Engine Type=5" to an appropriate value
// or leave it as is if you db is JET4X format (access 2000,2002)
//(yes, jetengine5 is for JET4X, no misprint here)

oParams = new object[] {
connectionString,
"Provider=Microsoft.Jet.OLEDB.4.0;Data" +
" Source=C:\\tempdb.mdb;Jet OLEDB:Engine Type=5"};

//invoke a CompactDatabase method of a JRO object
//pass Parameters array

objJRO.GetType().InvokeMember("CompactDatabase",
System.Reflection.BindingFlags.InvokeMethod,
null,
objJRO,
oParams);

//database is compacted now
//to a new file C:\\tempdb.mdw
//let's copy it over an old one and delete it

System.IO.File.Delete(mdwfilename);
System.IO.File.Move("C:\\tempdb.mdb", mdwfilename);
//clean up (just in case)
System.Runtime.InteropServices.Marshal.ReleaseComObject(objJRO);
objJRO=null;
}

参考资料:http://www.cnblogs.com/maxianghui/archive/2006/08/20/481886.html

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
关于聚金宝 买白银问题 平安银行个人贵金属交易业务有哪些? 网易云音乐为什么歌这么少? 公路边种的有什么花 高速路上常用的绿化花卉有那些? 公路绿化用什么花 我一键开核后顺利进入WIN7 系统,可是一开网站就重启是怎么回事,我开6... 电脑开不了机,反复重启,显示器也没反应 技嘉MA78LM-S2开核后怎么不能进系统?老是自动重启。 X3 440开核后不断重启 由于使用Access数据库越来越大,在程序中如何压缩Access的数据库文件,把 请教,Oracle中的语句写法~~~ 用oracle怎么写出这句语句…… ORACLE 查询语句怎么动态? oracle 存储过程中动态sql语句 oracle查询表索引是否有效 如何检测oracle里面的索引和存储过程是否失效 oracle 查看所有的索引是否失效 Oracle如何维护索引 oracle asm udev如何在线增加asm disk oracle asm最多可以添加多少个磁盘组 为什么RHEL 6上没有ASMLIB 如何理解Oracle中的incarnation概念 Oracle incarnation怎么理解 oracle中,如果有两万多条update一起执行,执行完再commit,这样做会有什么问题吗 oracle自定义函数调用存储过程为空,把存储过程中的update注释就没问题了 oracle的存储过程中,有2条update语句,那2次update是默认在同一个事务中还是分别执行相互没有影响? oracle在update一张很大的表的时候,每隔1000条commit一下,怎么实现 请教一条update语句(update过程中某行记录的值依赖于上一行更新后的值) 为什么我在github点击colone or download没反应 JAVA怎么压缩修复Access数据库? c# winform程序关于压缩、修复access数据库的问题 vb怎么调用access数据库的压缩功能 asp网站用的access数据库怎么在线压缩数据库 跪求破解microsoft access97数据库密码的软件或者方法!!! win7x64位、access2010x64、accessx64引擎也安装了,开发的winform程序无法调用access数据库 oracle 中游标 cursor 的简单问题 菜鸟 oracle 数据库 cursor 游标变量 column 列 名称 ... Eos数据块的长度 如何查看每个文件系统中有多少个数据块,每个数据块多大,有多少个inode oracle中数据块的大小与操作系统无关吗 如果os block大小是4k,以下哪个是oracle ORACLE OS块和数据块的区别是???求详解~ 请问Oracle何时开启一个事务啊,谢谢 oracle中delay block clean是什么意思 如何理解systemstate dump-eric0435-ITPUB博客 oracle中脏数据以及脏块是怎么来的,有啥区别 oracle db block changes 什么意思 如何阅读systemstate dump 新手,想要短期内开发一个oracle数据库,供团队在内网使用,不是如何着手?