美文网首页程序员工具癖
Access数据库文件操作辅助JetAccessUtil

Access数据库文件操作辅助JetAccessUtil

作者: 05b0963bb480 | 来源:发表于2018-12-17 08:21 被阅读1次

实现效果

本辅助类主要是用来方便实现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, "admin@laoguo.me");
//压缩不带密码的数据库
JetAccessUtil.CompactMDB(fileNoPass);
//压缩带密码的数据库
JetAccessUtil.CompactMDB(filePass, "admin@laoguo.me");
//重新设置数据库的密码
JetAccessUtil.SetMDBPassword(filePass, "admin@laoguo.me", "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;
        }
}

相关文章

网友评论

    本文标题:Access数据库文件操作辅助JetAccessUtil

    本文链接:https://www.haomeiwen.com/subject/ugzlcqtx.html