C#使用晚绑定来实现压缩Access数据库的方法
简介
Access数据库是一种非常常见的数据库,在我们使用过程中,经常会遇到需要压缩或者清理数据库的情况。通过C#语言来实现压缩Access数据库是一种非常方便的方法。这里主要通过晚绑定的方式来实现。
晚绑定
晚绑定,全称为Late Binding,是在运行时动态绑定对象。换句话说,就是在编译时不需要明确定义要使用哪一个类,而是在运行时通过反射来确定要使用哪个类。
实现步骤
第一步:添加引用
在项目中添加Microsoft.Office.Interop.Access.Dao
引用。
第二步:创建应用程序
定义应用程序变量,程序类型为Object,该类型是用于晚绑定使用的。
object oApp;
第三步:获取Access数据库对象
获取Access数据库对象,以便后面的操作。
oApp = Activator.CreateInstance(Type.GetTypeFromProgID("Access.Application")); //创建Access应用程序
第四步:打开数据库
打开需要压缩的数据库。
oApp.GetType().InvokeMember("OpenCurrentDatabase", System.Reflection.BindingFlags.InvokeMethod, null, oApp, new Object[2] { strAccessFilePath, true });
第五步:执行压缩操作
执行压缩操作前,需要判断Access版本号,然后针对版本号执行不同的操作。
获取Access数据库版本号。
string strVersion = oApp.GetType().InvokeMember("Version", System.Reflection.BindingFlags.GetProperty, null, oApp, null).ToString();
根据版本号执行不同的操作。
if (strVersion.StartsWith("12")) //Access 2007
{
oApp.GetType().InvokeMember("CompactRepair", System.Reflection.BindingFlags.InvokeMethod, null, oApp, new Object[3] { strAccessFilePath, strCompactAccessFilePath, true });
}
else if (strVersion.StartsWith("14")) //Access 2010
{
oApp.GetType().InvokeMember("CompactRepair", System.Reflection.BindingFlags.InvokeMethod, null, oApp, new Object[3] { strAccessFilePath, strCompactAccessFilePath, true });
}
else if (strVersion.StartsWith("15")) //Access 2013
{
oApp.GetType().InvokeMember("CompactRepair", System.Reflection.BindingFlags.InvokeMethod, null, oApp, new Object[4] { strAccessFilePath, strCompactAccessFilePath, true, true });
}
else if (strVersion.StartsWith("16")) //Access 2016/2019
{
oApp.GetType().InvokeMember("CompactRepair", System.Reflection.BindingFlags.InvokeMethod, null, oApp, new Object[4] { strAccessFilePath, strCompactAccessFilePath, true, true });
}
第六步:关闭数据库
关闭数据库,释放资源。
oApp.GetType().InvokeMember("CloseCurrentDatabase", System.Reflection.BindingFlags.InvokeMethod, null, oApp, null);
oApp.GetType().InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, oApp, null);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oApp);
oApp = null;
示例说明
示例一:Access 2007数据库的压缩
object oApp;
oApp = Activator.CreateInstance(Type.GetTypeFromProgID("Access.Application")); //创建Access应用程序
string strAccessFilePath = @"C:\Access2007.mdb";
string strCompactAccessFilePath = @"C:\Access2007_Compact.mdb";
oApp.GetType().InvokeMember("OpenCurrentDatabase", System.Reflection.BindingFlags.InvokeMethod, null, oApp, new Object[2] { strAccessFilePath, true });
string strVersion = oApp.GetType().InvokeMember("Version", System.Reflection.BindingFlags.GetProperty, null, oApp, null).ToString();
if (strVersion.StartsWith("12")) //Access 2007
{
oApp.GetType().InvokeMember("CompactRepair", System.Reflection.BindingFlags.InvokeMethod, null, oApp, new Object[3] { strAccessFilePath, strCompactAccessFilePath, true });
}
oApp.GetType().InvokeMember("CloseCurrentDatabase", System.Reflection.BindingFlags.InvokeMethod, null, oApp, null);
oApp.GetType().InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, oApp, null);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oApp);
oApp = null;
示例二:Access 2013数据库的压缩
object oApp;
oApp = Activator.CreateInstance(Type.GetTypeFromProgID("Access.Application")); //创建Access应用程序
string strAccessFilePath = @"C:\Access2013.accdb";
string strCompactAccessFilePath = @"C:\Access2013_Compact.accdb";
oApp.GetType().InvokeMember("OpenCurrentDatabase", System.Reflection.BindingFlags.InvokeMethod, null, oApp, new Object[2] { strAccessFilePath, true });
string strVersion = oApp.GetType().InvokeMember("Version", System.Reflection.BindingFlags.GetProperty, null, oApp, null).ToString();
if (strVersion.StartsWith("15")) //Access 2013
{
oApp.GetType().InvokeMember("CompactRepair", System.Reflection.BindingFlags.InvokeMethod, null, oApp, new Object[4] { strAccessFilePath, strCompactAccessFilePath, true, true });
}
oApp.GetType().InvokeMember("CloseCurrentDatabase", System.Reflection.BindingFlags.InvokeMethod, null, oApp, null);
oApp.GetType().InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, oApp, null);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oApp);
oApp = null;
总结
通过晚绑定的方式来实现Access数据库的压缩是一种非常方便的方法。在进行实现前需要注意Access的版本号,在压缩过程中针对不同的版本号执行不同的操作。同时,在压缩操作完毕后,需要关闭数据库,并释放资源,以防止资源占用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#使用晚绑定来实现压缩Access数据库的方法 - Python技术站