Access數據庫文件操作輔助JetAccessUtil

實現效果

本輔助類主要是用來方便實現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;
        }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章