實現效果
本輔助類主要是用來方便實現Access數據庫文件操作,包括
- 新建Access數據庫(可含密碼)
- 壓縮數據庫
- 設置數據庫密碼
- 列出數據庫表
- 列出數據庫表字段
實現步驟
- 在代碼引用相關的代碼實現動態調用。
實現代碼
輔助類庫JetAccessUtil的相關方法定義
/// 新建帶密碼的空Access 2000 數據庫
public static string CreateMDB(string mdbFilePath, string password)
/// 新建空的Access數據庫
public static string CreateMDB(string mdbFilePath)
/// 壓縮帶密碼Access數據庫
public static string CompactMDB(string mdbFilePath, string password)
/// 壓縮沒有帶密碼Access數據庫
public static string CompactMDB(string mdbFilePath)
/// 設置Access數據庫的訪問密碼
public static string SetMDBPassword(string mdbFilePath, string oldPwd, string newPwd)
/// 列出Access 2000 數據庫的表名稱
public static List<string> ListTables(string mdbFilePath, string password)
/// 列出Access2000數據庫的表字段
public static Dictionary<string, string> ListColumns(string mdbFilePath, string password, string tableName)
輔助類庫的使用例子
string fileNoPass = Path.Combine(Path.GetTempPath(), "EmptyNoPass.mdb");
string filePass = Path.Combine(Path.GetTempPath(), "EmptyWithPass.mdb");
//創建不帶密碼的空數據庫
JetAccessUtil.CreateMDB(fileNoPass);
//創建帶密碼的空數據庫
JetAccessUtil.CreateMDB(filePass, "[email protected]");
//壓縮不帶密碼的數據庫
JetAccessUtil.CompactMDB(fileNoPass);
//壓縮帶密碼的數據庫
JetAccessUtil.CompactMDB(filePass, "[email protected]");
//重新設置數據庫的密碼
JetAccessUtil.SetMDBPassword(filePass, "[email protected]", "123456789");
//列出數據庫的表名稱
List<string> tableNameList = JetAccessUtil.ListTables(filePass, "123456789");
string strNameList = "";
foreach (string name in tableNameList)
{
strNameList += string.Format(",{0}", name);
}
if (!string.IsNullOrEmpty(strNameList))
{
MessageUtil.ShowTips(strNameList);
}
Process.Start(Path.GetTempPath());
附上源碼
/// <summary>
/// Access數據庫文件操作輔助類
/// </summary>
public class JetAccessUtil
{
//Jet OLEDB:Engine Type Jet x.x Format MDB Files
//1 JET10
//2 JET11
//3 JET2X
//4 JET3X
//5 JET4X
/// <summary>
/// 新建帶密碼的空Access 2000 數據庫
/// </summary>
/// <param name="mdbFilePath">數據庫文件路徑</param>
/// <param name="password">數據庫密碼</param>
/// <returns>字符0爲操作成功,否則爲失敗異常消息。</returns>
public static string CreateMDB(string mdbFilePath, string password)
{
try
{
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;";
if (password == null || password.Trim() == "")
{
connStr += "Data Source=" + mdbFilePath;
}
else
{
connStr += "Jet OLEDB:Database Password=" + password + ";Data Source=" + mdbFilePath;
}
object objCatalog = Activator.CreateInstance(Type.GetTypeFromProgID("ADOX.Catalog"));
object[] oParams = new object[] { connStr };
objCatalog.GetType().InvokeMember("Create", BindingFlags.InvokeMethod, null, objCatalog, oParams);
Marshal.ReleaseComObject(objCatalog);
objCatalog = null;
return "0";
}
catch (Exception exp)
{
return exp.Message;
}
}
/// <summary>
/// 新建空的Access數據庫
/// </summary>
/// <param name="mdbFilePath">數據庫文件路徑</param>
/// <returns>字符0爲操作成功,否則爲失敗異常消息。</returns>
public static string CreateMDB(string mdbFilePath)
{
return CreateMDB(mdbFilePath, null);
}
/// <summary>
/// 壓縮帶密碼Access數據庫
/// </summary>
/// <param name="mdbFilePath">數據庫文件路徑</param>
/// <param name="password">數據庫密碼</param>
/// <returns>字符0爲操作成功,否則爲失敗異常消息。</returns>
public static string CompactMDB(string mdbFilePath, string password)
{
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;";
string connStrTemp = connStr;
string tmpPath = mdbFilePath + ".tmp";
if (password == null || password.Trim() == "")
{
connStr += "Data Source=" + mdbFilePath;
connStrTemp += "Data Source=" + tmpPath;
}
else
{
connStr += "Jet OLEDB:Database Password=" + password + ";Data Source=" + mdbFilePath;
connStrTemp += "Jet OLEDB:Database Password=" + password + ";Data Source=" + mdbFilePath + ".tmp";
}
string strRet = "";
try
{
object objJRO = Activator.CreateInstance(Type.GetTypeFromProgID("JRO.JetEngine"));
object[] oParams = new object[] { connStr, connStrTemp };
objJRO.GetType().InvokeMember("CompactDatabase", BindingFlags.InvokeMethod, null, objJRO, oParams);
Marshal.ReleaseComObject(objJRO);
objJRO = null;
}
catch (Exception exp)
{
strRet = exp.Message;
}
try
{
System.IO.File.Delete(mdbFilePath);
System.IO.File.Move(tmpPath, mdbFilePath);
}
catch (Exception expio)
{
strRet += expio.Message;
}
return (strRet == "") ? "0" : strRet;
}
/// <summary>
/// 壓縮沒有帶密碼Access數據庫
/// </summary>
/// <param name="mdbFilePath">數據庫文件路徑</param>
/// <returns>字符0爲操作成功,否則爲失敗異常消息。</returns>
public static string CompactMDB(string mdbFilePath)
{
return CompactMDB(mdbFilePath, null);
}
/// <summary>
/// 設置Access數據庫的訪問密碼
/// </summary>
/// <param name="mdbFilePath">數據庫文件路徑</param>
/// <param name="oldPwd">舊密碼</param>
/// <param name="newPwd">新密碼</param>
/// <returns>字符0爲操作成功,否則爲失敗異常消息。</returns>
public static string SetMDBPassword(string mdbFilePath, string oldPwd, string newPwd)
{
string connStr = string.Concat("Provider=Microsoft.Jet.OLEDB.4.0;",
"Mode=Share Deny Read|Share Deny Write;", //獨佔模式
"Jet OLEDB:Database Password=" + oldPwd + ";Data Source=" + mdbFilePath);
using (OleDbConnection conn = new OleDbConnection(connStr))
{
try
{
conn.Open();
//如果密碼爲空時,請不要寫方括號,只寫一個null即可
string sqlOldPwd = (oldPwd == null || oldPwd.Trim() == "") ? "null" : "[" + oldPwd + "]";
string sqlNewPwd = (newPwd == null || newPwd.Trim() == "") ? "null" : "[" + newPwd + "]";
OleDbCommand cmd = new OleDbCommand(string.Concat("ALTER DATABASE PASSWORD ", sqlNewPwd, " ", sqlOldPwd),
conn);
cmd.ExecuteNonQuery();
conn.Close();
return "0";
}
catch (Exception exp)
{
return exp.Message;
}
}
}
/// <summary>
/// 列出Access 2000 數據庫的表名稱
/// </summary>
/// <param name="mdbFilePath">數據庫文件路徑</param>
/// <param name="password">數據庫密碼</param>
/// <returns></returns>
public static List<string> ListTables(string mdbFilePath, string password)
{
List<string> list = new List<string>();
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;";
if (password == null || password.Trim() == "")
{
connStr += "Data Source=" + mdbFilePath;
}
else
{
connStr += "Jet OLEDB:Database Password=" + password + ";Data Source=" + mdbFilePath;
}
using (OleDbConnection conn = new OleDbConnection(connStr))
{
conn.Open();
DataTable schemaTable =
conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
for (int i = 0; i < schemaTable.Rows.Count; i++)
{
string tablename = schemaTable.Rows[i]["TABLE_NAME"].ToString();
list.Add(tablename);
}
}
return list;
}
/// <summary>
/// 列出Access2000數據庫的表字段
/// </summary>
/// <param name="mdbFilePath">數據庫文件路徑</param>
/// <param name="password">數據庫密碼</param>
/// <param name="tableName">表名稱</param>
/// <returns>返回字段名稱和對應類型的字典數據</returns>
public static Dictionary<string, string> ListColumns(string mdbFilePath, string password, string tableName)
{
Dictionary<string, string> list = new Dictionary<string, string>();
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;";
if (password == null || password.Trim() == "")
{
connStr += "Data Source=" + mdbFilePath;
}
else
{
connStr += "Jet OLEDB:Database Password=" + password + ";Data Source=" + mdbFilePath;
}
using (OleDbConnection conn = new OleDbConnection(connStr))
{
conn.Open();
DataTable schemaTable = GetReaderSchema(tableName, conn);
foreach (DataRow dr in schemaTable.Rows)
{
string columnName = dr["ColumnName"].ToString();
string datatype = ((OleDbType)dr["ProviderType"]).ToString();//對應數據庫類型
string netType = dr["DataType"].ToString();//對應的.NET類型,如System.String
list.Add(columnName, netType);
}
}
return list;
}
/// <summary>
/// 查看數據表的Schema信息
/// </summary>
/// <param name="tableName">表名稱</param>
/// <param name="connection">連接對象</param>
/// <returns></returns>
private static DataTable GetReaderSchema(string tableName, OleDbConnection connection)
{
DataTable schemaTable = null;
IDbCommand cmd = new OleDbCommand();
cmd.CommandText = string.Format("select * from [{0}]", tableName);
cmd.Connection = connection;
using (IDataReader reader = cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly))
{
schemaTable = reader.GetSchemaTable();
}
return schemaTable;
}
}