介紹
下面這段c# 代碼可以用來壓縮和修復(fù)access數(shù)據(jù)庫,不管它是一個(gè)簡單的.mdbaccess數(shù)據(jù)庫還是一個(gè).mdw網(wǎng)絡(luò)共享數(shù)據(jù)庫,這個(gè)過程和你在用ms access應(yīng)用程序中使用的工具-數(shù)據(jù)庫實(shí)用工具-壓縮和修復(fù)時(shí)執(zhí)行的操作完全一樣.實(shí)例代碼使用了遲綁定(運(yùn)行中在內(nèi)存中建立com對(duì)象),這樣就不需要在工程中加入com引用了,也不需要在pc上安裝ms access應(yīng)用程序.只需要一個(gè)jet引擎(jet引擎包含在mdac安裝包中,在windows nt4以后的版本中,系統(tǒng)已經(jīng)自帶了這個(gè)引擎).
c#操作access數(shù)據(jù)庫的背景
不知你是否也厭煩了在工程中加入復(fù)雜的com庫引用,但我相信這個(gè)純.net代碼將省去額外的交互操作, rcws和com引用.基本上,由于系統(tǒng)中安裝的microsoft類庫的不同(例如:ms office object library 9,10,11等等),我們也不知道用戶pc中安裝的office版本,所以我們要通過progid來訪問com對(duì)象,而不能用clsid.例如,當(dāng)調(diào)用excel.application,時(shí),得到的是excel,而不管系統(tǒng)中安裝ms office的版本,當(dāng)在代碼中加入ms excel 10 object library引用時(shí),其實(shí)只是給應(yīng)用程序加入了一個(gè)非常受限制的功能.所以我們使用system.reflection和遲綁定.
1. 實(shí)例代碼
只需調(diào)用compactaccessdb函數(shù)即可壓縮和修復(fù)目標(biāo)數(shù)據(jù)庫.
2. 參數(shù):
connectionstring – 用來連接到access數(shù)據(jù)庫.
mdwfilename –要壓縮的mdb文件的全名(路徑+文件名).
由于jet引擎的限制,執(zhí)行此方法壓縮access數(shù)據(jù)庫會(huì)把結(jié)果生成為一個(gè)新文件,所以我們要還需要把這個(gè)新的access文件拷貝到目的位置覆蓋原來未壓縮文件.
當(dāng)調(diào)用此方法時(shí)請確認(rèn)被壓縮數(shù)據(jù)庫無打開的連接.
/**//// 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;
}
更多信息請查看IT技術(shù)專欄