0

0

[Access] C#通过COM组件访问Access文件

php中文网

php中文网

发布时间:2016-06-07 15:37:28

|

1516人浏览过

|

来源于php中文网

原创

说明: 1,采用dynamic调用COM组件,适用于.NET 4.0以上支持dynamic版本的才可以; 2,执行速度不敢恭维,只是因为要用于Silverlight OOB模式中才研究一二; 3,测试环境 .net 4.5 + Silverlight 5.0 + Visual Studio 2013 4,见如下helper类(需引用 using

说明:

1,采用dynamic调用com组件,适用于.net 4.0以上支持dynamic版本的才可以;

2,执行速度不敢恭维,只是因为要用于Silverlight OOB模式中才研究一二;

3,测试环境.net 4.5 + Silverlight 5.0 + Visual Studio 2013

4,见如下helper类(需引用using System.Runtime.InteropServices.Automation;):

[Access] C#通过COM组件访问Access文件[Access] C#通过COM组件访问Access文件

  1 public class SLAccessHelper
  2 {
  3     private dynamic m_AccessApp;// Access.Application
  4     private dynamic m_Database;// Database
  5     private dynamic m_Recordset;
  6 
  7     /// 
  8     /// 构造函数
  9     /// 
 10     /// Access是否可见
 11     public SLAccessHelper(bool visible)
 12     {
 13         m_AccessApp = AutomationFactory.CreateObject("Access.Application");
 14         m_AccessApp.Visible = visible;
 15     }
 16 
 17     /// 
 18     /// 打开数据库
 19     /// 
 20     /// Access数据库文件路径
 21     /// 是否共享
 22     /// 密码
 23     public void OpenDb(string filePath, bool exclusive = false, string bstrPassword = "")
 24     {
 25         m_AccessApp.OpenCurrentDatabase(filePath, exclusive, bstrPassword);
 26         m_Database = m_AccessApp.CurrentDb();
 27     }
 28 
 29     /// 
 30     /// 获取当前数据库中所有表名称集合
 31     /// 
 32     /// 所有表名称集合
 33     public List<string> GetTableNames()
 34     {
 35         List<string> tableNames = new List<string>();
 36         dynamic tableDefs = m_Database.TableDefs;
 37         foreach (dynamic tableDef in tableDefs)
 38         {
 39             tableNames.Add(tableDef.Name);
 40         }
 41 
 42         return tableNames;
 43     }
 44 
 45     /// 
 46     /// 加载表数据
 47     /// 
 48     /// 表名称
 49     /// 表数据
 50     public Liststring>> LoadTable(string tableName)
 51     {
 52         dynamic recordSet = m_Database.OpenRecordset(tableName);
 53         int fieldsCount = recordSet.Fields.Count;
 54         Liststring>> data = new Liststring>>();
 55         if (fieldsCount > 0)
 56         {
 57             try
 58             {
 59                 List<string> fieldNames = new List<string>();
 60                 for (int i = 0; i < fieldsCount; i++)
 61                 {
 62                     fieldNames.Add(recordSet.Fields[i].Name);
 63                 }
 64                 data.Add(fieldNames);
 65                 if (!recordSet.EOF)
 66                 {
 67                     recordSet.MoveFirst();
 68                     while (!recordSet.EOF)
 69                     {
 70                         object[] dataRow = recordSet.GetRows();// 返回一维数组
 71                         List<string> dataRowStr = new List<string>();
 72                         for (int i = 0; i < dataRow.Length; i++)
 73                         {
 74                             dataRowStr.Add(dataRow[i] == null ? "" : dataRow[i].ToString());
 75                         }
 76                         data.Add(dataRowStr);
 77                     }
 78                 }
 79             }
 80             catch (Exception ex)
 81             {
 82                 throw new Exception(ex.Message);
 83             }
 84             finally
 85             {
 86                 if (recordSet != null)
 87                 {
 88                     recordSet.Close();
 89                     ((IDisposable)recordSet).Dispose();
 90                     recordSet = null;
 91                 }
 92             }
 93         }
 94 
 95         return data;
 96     }
 97 
 98     /// 
 99     /// 添加新纪录
100     /// 
101     /// 表格名称
102     /// 数据
103     public void AddNewRecord(string tableName, Liststring, object>> data)
104     {
105         try
106         {
107             m_Recordset = m_Database.OpenRecordset(tableName, 1);// 1=RecordsetTypeEnum.dbOpenTable
108             int fieldsCount = m_Recordset.Fields.Count;
109             List<string> fieldNames = new List<string>();
110             for (int i = 0; i < fieldsCount; i++)
111             {
112                 fieldNames.Add(m_Recordset.Fields[i].Name);
113             }
114             for (int rowIndex = 0; rowIndex < data.Count; rowIndex++)
115             {
116                 m_Recordset.AddNew();
117                 foreach (string fieldName in fieldNames)
118                 {
119                     m_Recordset.Fields[fieldName].Value = data[rowIndex][fieldName];
120                 }
121                 m_Recordset.Update();
122             }
123         }
124124         catch(Exception ex)
125         {
126             throw new Exception(ex.Message);
127         }
128         finally
129         {
130             if (m_Recordset != null)
131             {
132                 m_Recordset.Close();
133                 ((IDisposable)m_Recordset).Dispose();
134                 m_Recordset = null;
135             }
136         }
137     }
138 
139     /// 
140     /// 更新表格数据
141     /// 
142     /// 表格名称
143     /// 数据
144     public void UpdateTable(string tableName, Liststring, string>> data)
145     {
146         try
147         {
148             m_Recordset = m_Database.OpenRecordset(tableName, 1);// 1=RecordsetTypeEnum.dbOpenTable
149             m_Recordset.MoveFirst();
150             for (int rowIndex = 0; rowIndex < data.Count; rowIndex++)
151             {
152                 m_Recordset.Edit();
153                 foreach (string fieldName in data[rowIndex].Keys)
154                 {
155                     m_Recordset.Fields[fieldName].Value = data[rowIndex][fieldName];
156                 }
157                 m_Recordset.Update();
158                 m_Recordset.MoveNext();
159             }
160         }
161         catch (Exception ex)
162         {
163             throw new Exception(ex.Message);
164         }
165         finally
166         {
167             if (m_Recordset != null)
168             {
169                 m_Recordset.Close();
170                 ((IDisposable)m_Recordset).Dispose();
171                 m_Recordset = null;
172             }
173         }
174     }
175 
176     /// 
177     /// 关闭
178     /// 
179     public void Close()
180     {
181         if (m_Database != null)
182         {
183             m_Database.Close();
184             ((IDisposable)m_Database).Dispose();
185             m_Database = null;
186         }
187         if (m_AccessApp != null)
188         {
189             m_AccessApp.CloseCurrentDatabase();
190             // m_AccessApp.Quit();// 导致最后会弹出Access主页面
191             ((IDisposable)m_AccessApp).Dispose();
192             m_AccessApp = null;
193         }
194         GC.Collect();
195     }
196 }

View Code

 

企业WAP2.0网站管理系统1.0
企业WAP2.0网站管理系统1.0

系统安装步骤   1、安装QuickWAP组件。将QuickWAP.dll拷贝到System32文件夹下,在开始菜单运行 regsvr32 QuickWAP.dll 即可。   2、将“WAP2.0企业系统源码”目录下的文件通过FTP传到服务器上,或在本机IIS上调试,然后通过域名或IP访问。 简介:   新版企业WAP2.0手机网站采用QuickWAP X

下载

通过dynamic构建的COM对象,在使用完成后都要手动关闭销毁,比如代码中的m_AccessApp, m_Database, m_Recordset三个对象,否则只是将m_AccessApp关闭清空释放掉,Access进程还是无法关闭,在程序关闭之前,始终都会有一个空白的无法关闭的Access界面;

在循环中处理dynamic和C#类型转换会降低程序执行效率,就比如像GetTableNames方法中循环遍历表名,都要花两三秒时间,所以尽量像object[] dataRow = recordSet.GetRows();直接获取其中的所有数据,然后再遍历处理,会极大提高执行效率;

要修改Access中的数据时,一定要先m_Recordset.Edit();才会允许你编辑其中的内容;

相关文章

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.7万人学习

最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号