用C#紧缩和修复Access数据库
摘要:用C#紧缩和修复Access数据库
用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;
}
下面这段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;
}