一、实现效果

1.1、实现功能

  ①实现创建Access数据库;

  ②实现创建指定Access数据库的表;

  ③实现给Access数据库的指定表【插入、查询、更新、删除、分页查询】数据;

  ④实现获取Access数据库中的所有表名称及其表包含的所有列名称

1.2、效果图

access 操作其他数据库 access数据库应用操作_access 操作其他数据库

二、实现核心

该项目的完整工程下载地址如下:Access数据库操作项目的完整工程下载地址

access 操作其他数据库 access数据库应用操作_Access数据库_02

2.1、添加引用

  在项目中添加【Microsoft ActiveX Data Objects 6.0 Library】和【Microsoft ADO Ext.6.0 for DDL and Security】引用,如下图所示。

access 操作其他数据库 access数据库应用操作_Access帮助类_03

注意事项:

引入这两个Com组件后,在使用【ADOX.CatalogClass】报如下图的错误时;只用选中【Interop.ADOX】,然后在属性下的【嵌入互操作类型-->修改为否】即可解决,如下图所示:

access 操作其他数据库 access数据库应用操作_Access帮助类_04

access 操作其他数据库 access数据库应用操作_Access数据库_05

 

access 操作其他数据库 access数据库应用操作_Access帮助类_06

2.2、Access数据帮助类

这里Access数据库帮助类的部分内容,如下所示:

/***
*	Title:"轻量数据库" 项目
*		主题:Access数据库的帮助类
*	Description:
*		功能:
*		    ①构造函数时可以创建Access指定的连接字符串
*		    ②创建Access的mdb类型数据库
*	Date:2022
*	Version:0.1版本
*	Author:Coffee
*	Modify Recoder:
*/

using LiteDBHelper.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.OleDb;
using System.IO;
using System.Text;

namespace LiteDBHelper
{
    public class AccessDBHelper
    {

        #region   基础参数
        //数据库连接字符串
        private string _ConnStr;

        //获取到数据库连接字符串
        public string ConnStr { get { return _ConnStr; } }

        #endregion 


        #region   构造函数
        /// <summary>
        /// mdb文件的连接字符串构造函数
        /// </summary>
        /// <param name="connnection"></param>
        public AccessDBHelper(string connnection)
        {
            if (string.IsNullOrEmpty(connnection)) return;

            _ConnStr = connnection;
        }

        /// <summary>
        /// mdb文件无用户名和密码构造函数
        /// </summary>
        /// <param name="mdbFilePathAndName">mdb文件的路径和名称(比如:@"D:\\HalmEL\\2022-4-11.mdb")</param>
        public AccessDBHelper(string mdbFilePathAndName,AccessDBType accessDBType)
        {
            if (string.IsNullOrEmpty(mdbFilePathAndName)) return;

            string strDriver = GetDirverOfAccessDBType(accessDBType);
            _ConnStr = $"{strDriver};Data source={mdbFilePathAndName};";

            InstanceSqlHelper(_ConnStr);
        }

        #endregion


        #region   创建Access数据库、表及其字段

        /// <summary>
        /// 创建Mdb数据库
        /// </summary>
        /// <param name="mdbFilePathAndName">mdb文件的路径和名称(比如:@"D:\\HalmEL\\2022-4-11.mdb")</param>
        /// <returns>返回创建结果</returns>
        public ResultInfo CreateMdbDataBase(string mdbFilePathAndName)
        {
            ResultInfo resultInfo = new ResultInfo();

            if (File.Exists(mdbFilePathAndName))
            {
                resultInfo.ResultStatus = ResultStatus.Success;
                resultInfo.Message = $"{mdbFilePathAndName} 文件已经存在!";
            }
            try
            {
                //如果目录不存在,则创建目录
                string folder = Path.GetDirectoryName(mdbFilePathAndName);
                if (!Directory.Exists(folder))
                {
                    Directory.CreateDirectory(folder);
                }
                //创建Catalog目录类
                ADOX.CatalogClass catalog = new ADOX.CatalogClass();

                //根据联结字符串使用Jet数据库引擎创建数据库
                catalog.Create(_ConnStr);
                catalog = null;

                resultInfo.ResultStatus = ResultStatus.Success;
                resultInfo.Message = $"{mdbFilePathAndName} 文件创建成功!";
            }
            catch (Exception ex)
            {
                resultInfo.ResultStatus = ResultStatus.Error;
                resultInfo.Message = $"{ex.Message}";
            }

            return resultInfo;
        }

        /// <summary>
        /// 创建mdb表(字段都是短文本类型)
        /// </summary>
        /// <param name="mdbFilePathAndName">mdb文件的路径和名称(比如:@"D:\\HalmEL\\2022-4-11.mdb")</param>
        /// <param name="tableName">表名称</param>
        /// <param name="fieldNameList">表字段名称列表</param>
        /// <returns></returns>
        public ResultInfo CreateMdbTable(string mdbFilePathAndName, string tableName, List<string> fieldNameList)
        {
            ResultInfo resultInfo = new ResultInfo();

            if (string.IsNullOrEmpty(mdbFilePathAndName) || string.IsNullOrEmpty(tableName)
                || fieldNameList == null || fieldNameList.Count < 1)
            {
                resultInfo.SetContent(ResultStatus.Error, "内容为空,请检查!", null);

                return resultInfo;
            }


            ADOX.CatalogClass catalog = new ADOX.CatalogClass();
            ADODB.Connection connection = new ADODB.Connection();

            try
            {
                //打开数据库连接
                connection.Open(_ConnStr, null, null, -1);
                catalog.ActiveConnection = connection;

                //新建一个表
                ADOX.TableClass table = new ADOX.TableClass();
                table.ParentCatalog = catalog;
                table.Name = tableName;

                int fieldCount = fieldNameList.Count;
                for (int i = 0; i < fieldCount; i++)
                {
                    //增加一个文本字段
                    string fieldName = fieldNameList[i].ToString();
                    ADOX.ColumnClass column = new ADOX.ColumnClass();
                    column.ParentCatalog = catalog;
                    column.Name = fieldName;
                    column.Properties["Jet OLEDB:Allow Zero Length"].Value = false;
                    //table.Columns.Append(column, ADOX.DataTypeEnum.adLongVarChar, 100);
                    table.Columns.Append(fieldName, ADOX.DataTypeEnum.adVarWChar, 106);

                }

                //将创建的表加入数据库
                catalog.Tables.Append(table);
                table = null;
                catalog = null;

                resultInfo.SetContent(ResultStatus.Success, $"创建:{tableName} 表成功", null);
            }
            catch (Exception ex)
            {
                resultInfo.SetContent(ResultStatus.Error, $"{ex.Message}", null);
            }
            finally
            {
                //关闭连接
                connection.Close();
            }

            return resultInfo;
        }

        #endregion



        #region   私有方法

        /// <summary>
        /// 根据Access类型返回对应的驱动
        /// </summary>
        /// <param name="accessDBType">Access数据库类型</param>
        /// <returns></returns>
        private string GetDirverOfAccessDBType(AccessDBType accessDBType)
        {
            string connStr = $"Microsoft.ACE.OLEDB.12.0";

            switch (accessDBType)
            {
                case AccessDBType.Is2007AndLater:
                    connStr = $"Provider=Microsoft.ACE.OLEDB.12.0";
                    break;
                case AccessDBType.Is2003AndBefore:
                    connStr = $"Provider=Microsoft.Jet.OLEDB.4.0";
                    break;
                default:
                    break;
            }

            return connStr;
        }

        #endregion 


    }//Class_end


    /// <summary>
    /// Access数据库类型
    /// </summary>
    public enum AccessDBType
    {
        //2007及其更高的版本
        Is2007AndLater,
        //2003等之前的版本
        Is2003AndBefore,

    }


}

2.3、关于未注册Microsoft.ACE.OLEDB.12.0解决办法

程序报错“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”解决办法

access 操作其他数据库 access数据库应用操作_Access数据库_02

三、其他的相关资料

DataTypeEnum - ActiveX Data Objects (ADO) | Microsoft Docs

access 操作其他数据库 access数据库应用操作_Access数据库_02

https://docs.microsoft.com/zh-cn/sql/ado/reference/ado-api/datatypeenum?view=sql-server-ver15Access 桌面数据库的数据类型 (microsoft.com)

access 操作其他数据库 access数据库应用操作_Access数据库_02

https://support.microsoft.com/zh-cn/office/access-%E6%A1%8C%E9%9D%A2%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B-df2b83ba-cef6-436d-b679-3418f622e482#ID0EBBD=Office_2007_-_2010INSERT INTO 语句 (Microsoft Access SQL) | Microsoft Docs

access 操作其他数据库 access数据库应用操作_Access数据库_02

https://docs.microsoft.com/zh-cn/office/client-developer/access/desktop-database-reference/insert-into-statement-microsoft-access-sql概念(Access VBA 参考) | Microsoft Docs

access 操作其他数据库 access数据库应用操作_Access数据库_02

https://docs.microsoft.com/zh-cn/office/vba/access/concepts/miscellaneous/concepts-access-vba-reference\t \r \n转义字符

access 操作其他数据库 access数据库应用操作_Access数据库_02