一、实现效果
1.1、实现功能
①实现创建Access数据库;
②实现创建指定Access数据库的表;
③实现给Access数据库的指定表【插入、查询、更新、删除、分页查询】数据;
④实现获取Access数据库中的所有表名称及其表包含的所有列名称
1.2、效果图
二、实现核心
该项目的完整工程下载地址如下:Access数据库操作项目的完整工程下载地址
2.1、添加引用
在项目中添加【Microsoft ActiveX Data Objects 6.0 Library】和【Microsoft ADO Ext.6.0 for DDL and Security】引用,如下图所示。
注意事项:
引入这两个Com组件后,在使用【ADOX.CatalogClass】报如下图的错误时;只用选中【Interop.ADOX】,然后在属性下的【嵌入互操作类型-->修改为否】即可解决,如下图所示:
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”提供程序”解决办法