[Access] C# 通过 COM 组件访问 Access 文件
说明:
- public class SLAccessHelper
- {
- private dynamic m_AccessApp;// Access.Application
- private dynamic m_Database;// Database
- private dynamic m_Recordset;
- /// <summary>
- /// 构造函数
- /// </summary>
- /// <param name="visible">Access是否可见</param>
- public SLAccessHelper(bool visible)
- {
- m_AccessApp = AutomationFactory.CreateObject("Access.Application");
- m_AccessApp.Visible = visible;
- }
- /// <summary>
- /// 打开数据库
- /// </summary>
- /// <param name="filePath">Access数据库文件路径</param>
- /// <param name="exclusive">是否共享</param>
- /// <param name="bstrPassword">密码</param>
- public void OpenDb(string filePath, bool exclusive = false, string bstrPassword = "")
- {
- m_AccessApp.OpenCurrentDatabase(filePath, exclusive, bstrPassword);
- m_Database = m_AccessApp.CurrentDb();
- }
- /// <summary>
- /// 获取当前数据库中所有表名称集合
- /// </summary>
- /// <returns>所有表名称集合</returns>
- public List<string> GetTableNames()
- {
- List<string> tableNames = new List<string>();
- dynamic tableDefs = m_Database.TableDefs;
- foreach (dynamic tableDef in tableDefs)
- {
- tableNames.Add(tableDef.Name);
- }
- return tableNames;
- }
- /// <summary>
- /// 加载表数据
- /// </summary>
- /// <param name="tableName">表名称</param>
- /// <returns>表数据</returns>
- public List<List<string>> LoadTable(string tableName)
- {
- dynamic recordSet = m_Database.OpenRecordset(tableName);
- int fieldsCount = recordSet.Fields.Count;
- List<List<string>> data = new List<List<string>>();
- if (fieldsCount > )
- {
- try
- {
- List<string> fieldNames = new List<string>();
- for (int i = ; i < fieldsCount; i++)
- {
- fieldNames.Add(recordSet.Fields[i].Name);
- }
- data.Add(fieldNames);
- if (!recordSet.EOF)
- {
- recordSet.MoveFirst();
- while (!recordSet.EOF)
- {
- object[] dataRow = recordSet.GetRows();// 返回一维数组
- List<string> dataRowStr = new List<string>();
- for (int i = ; i < dataRow.Length; i++)
- {
- dataRowStr.Add(dataRow[i] == null ? "" : dataRow[i].ToString());
- }
- data.Add(dataRowStr);
- }
- }
- }
- catch (Exception ex)
- {
- throw new Exception(ex.Message);
- }
- finally
- {
- if (recordSet != null)
- {
- recordSet.Close();
- ((IDisposable)recordSet).Dispose();
- recordSet = null;
- }
- }
- }
- return data;
- }
- /// <summary>
- /// 添加新纪录
- /// </summary>
- /// <param name="tableName">表格名称</param>
- /// <param name="data">数据</param>
- public void AddNewRecord(string tableName, List<Dictionary<string, object>> data)
- {
- try
- {
- m_Recordset = m_Database.OpenRecordset(tableName, );// 1=RecordsetTypeEnum.dbOpenTable
- int fieldsCount = m_Recordset.Fields.Count;
- List<string> fieldNames = new List<string>();
- for (int i = ; i < fieldsCount; i++)
- {
- fieldNames.Add(m_Recordset.Fields[i].Name);
- }
- for (int rowIndex = ; rowIndex < data.Count; rowIndex++)
- {
- m_Recordset.AddNew();
- foreach (string fieldName in fieldNames)
- {
- m_Recordset.Fields[fieldName].Value = data[rowIndex][fieldName];
- }
- m_Recordset.Update();
- }
- }
- catch(Exception ex)
- {
- throw new Exception(ex.Message);
- }
- finally
- {
- if (m_Recordset != null)
- {
- m_Recordset.Close();
- ((IDisposable)m_Recordset).Dispose();
- m_Recordset = null;
- }
- }
- }
- /// <summary>
- /// 更新表格数据
- /// </summary>
- /// <param name="tableName">表格名称</param>
- /// <param name="data">数据</param>
- public void UpdateTable(string tableName, List<Dictionary<string, string>> data)
- {
- try
- {
- m_Recordset = m_Database.OpenRecordset(tableName, );// 1=RecordsetTypeEnum.dbOpenTable
- m_Recordset.MoveFirst();
- for (int rowIndex = ; rowIndex < data.Count; rowIndex++)
- {
- m_Recordset.Edit();
- foreach (string fieldName in data[rowIndex].Keys)
- {
- m_Recordset.Fields[fieldName].Value = data[rowIndex][fieldName];
- }
- m_Recordset.Update();
- m_Recordset.MoveNext();
- }
- }
- catch (Exception ex)
- {
- throw new Exception(ex.Message);
- }
- finally
- {
- if (m_Recordset != null)
- {
- m_Recordset.Close();
- ((IDisposable)m_Recordset).Dispose();
- m_Recordset = null;
- }
- }
- }
- /// <summary>
- /// 关闭
- /// </summary>
- public void Close()
- {
- if (m_Database != null)
- {
- m_Database.Close();
- ((IDisposable)m_Database).Dispose();
- m_Database = null;
- }
- if (m_AccessApp != null)
- {
- m_AccessApp.CloseCurrentDatabase();
- // m_AccessApp.Quit();// 导致最后会弹出Access主页面
- ((IDisposable)m_AccessApp).Dispose();
- m_AccessApp = null;
- }
- GC.Collect();
- }
- }
在循环中处理 dynamic 和 C# 类型转换会降低程序执行效率,就比如像 GetTableNames 方法中循环遍历表名,都要花两三秒时间,所以尽量像 object[] dataRow = recordSet.GetRows(); 直接获取其中的所有数据,然后再遍历处理,会极大提高执行效率;
要修改 Access 中的数据时,一定要先 m_Recordset.Edit(); 才会允许你编辑其中的内容;
[Access] C# 通过 COM 组件访问 Access 文件的更多相关文章
- IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol)。
IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol).IMA ...
- Unity访问Access数据库
首先,准备工作: 创建一个Access 数据库,命名AccessTest.accdb,添加一些数据用于测试 准备System.Data.dll与System.EnterpriseServices.dl ...
- [转载]Unity3D 访问Access数据库
在开始这个小教程之前呢,其实在网上你已经可以找到相关的资料了,但是我还是要把我自己做练习的一点东西分享出来.写这个教程的主要原因呢,是一个朋友在u3d的官网论坛里,找到了这个demo,但是在他使用的过 ...
- 如何使用.net访问Access数据库 (转)
前言:今天整理程序,看到之前写的一个Demo,也不知道是从哪里参考的了,写到这里,留作备用吧. 使用.net访问Access数据库:1.BL层:新增一个DataAccess类. Code].Defau ...
- C#.NET ORM 如何访问 Access 数据库 [FreeSql]
最近很多 .net QQ 群无故被封停,特别是 wpf 群几乎全军覆没.依乐祝的 .net6交流群,晓晨的 .net跨平台交流群,导致很多码友流离失所无家可归,借此机会使用一次召唤术,有需要的请加群: ...
- ADO访问Access数据库错误解决心得随笔
最近在用ADO访问Access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下. 环境 win7 x86系统: VS2012编译器: Office2010: Access2000~ ...
- 访问Access日期字段
在使用sql访问Access日期字段,应在变量前后加#,例子: s:=Format(select xueshID,name,times,qukbz,skdate,banji from dianmjil ...
- java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 不能使用 '(未知的)';文件已在使用中
最近查看程序输入的日志时发现一个java连接Access的程序时不时的抛出: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driv ...
- Excel中使用VBA访问Access数据库
VBA访问Access数据库 1. 通用自动化语言VBA VBA(Visual Basic For Application)是一种通用自动化语言,它可以使Excel中的常用操作自动化,还可以创建自定义 ...
随机推荐
- OstrichNet 简易统计信息收集工具
Ostrich 是twitter用于监控服务器性能的一个scala库,项目地址https://github.com/twitter/ostrich, 主要功能是收集.展示统计信息, 同时也提供了关闭服 ...
- [PHP源码阅读]strlen函数
文章来自:http://www.hoohack.me/2016/02/22/phps-source-analytics-strlen 我在github有对PHP源码更详细的注解.感兴趣的可以围观一下, ...
- 说说SQL Server 网络配置
打开Sql Server Configuration Manager,里面显示了SQL Server的网络配置,这些到底表示什么含义呢? 图一:MSSQLSERVER的协议 这些配置选项,其实就是为了 ...
- php性能优化
序 很长时间没有写博文了,最近换了工作,长时间加班,根本没有时间做其他事情!今天闲下来了,想一想php性能方面的事情.这也是我2014年的第一篇博文! 推荐阅读:初学者到中级者应该掌握的! p ...
- Azure PowerShell (1) PowerShell入门
<Windows Azure Platform 系列文章目录> Update: 2016-01-11 笔者文档主要都是用Azure PowerShell 0.x版本来实现的,比如0.98版 ...
- Redis 发布订阅用法
一.发布订阅模型发布订阅其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易变化的发送方和接收方. 发送方:只负责向第三方发送消息.(杂志社把读者杂志交给邮局)接 ...
- xamarin 手机顶部状态栏
修改显示xamarin开发的App的手机顶部状态栏, 步骤一:在项目UWP上的“引用”里右键“添加引用”,选择->Universal Windows->Windows Mobile Ext ...
- HTML 最简单的tips 怎么支持指定DIV显示提示信息
<body> <style type="text/css"> a.link{position:relative;} a.link div.tips{ bor ...
- c# 文件属性读取操作及文件之间操作
c# 获取文件最后修改日期代码FileInfo f = new FileInfo(@"c:\1.txt");Console.WriteLine(f.LastWriteTime.To ...
- 用电脑给手机安装App
每一个账号密码只允许同时授权5台电脑,当授权满后还想授权其他的就必须删除以前的授权.