本地数据库可以有Y种选择,比如Sqlite、SQL Server Express、SQL Local DB、SQL Server CE、Access等,本文老周选用比较著名的Access本地数据库,在连接数据库应该注意的几个事情。

Access数据库是Office家族的一员,历史悠久,相信各位不会陌生。不过,有些东西可能你以前没关注到,不妨咱们一起关注一下。

一、判断用于连接的Provider是否可用

过去,连接Access数据库,我们都会使用OLEDB的Microsoft.Jet.OLEDB.4.0提供程序,系统默认也带有该驱动程序,所以使用起来也特特地方便。

但jet.oledb通常是32位的,如果应用程序编译为x64版本,会发生异常。如下图所示。

如果改为x86就可以正常运行。而且,你也发现了,改用Any CPU也可以正常运行,为啥呢。

现在你打开项目属性窗口,然后切换到“生成”选项卡,在Any CPU选项中,是不是看到一个选项叫“首选32位”?好,现在你把“首选32位”的对勾去掉,如下图所示。

然后,你在64位平台上运行,同样会发生异常。如果勾选了“首选32位”就不会发生异常。

万物皆在变化之中,Access版本不断更新,从2007起,.mdb文件变成了.accdb文件,所以,使用Jet.OLEDB引擎是不能连接.mdb文件的。

连接.accdb文件的提供程序为Microsoft.ACE.OLEDB.12.0,即连接字符串应该这样写:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\students.accdb

有关连接字符串,你可以到下面这个网站上抄:http://www.connectionstrings.com/

这个网站上面可以找到各种各样数据库的连接字符串,资源丰富,相当值得收

系统默认是不带Microsoft.ACE.OLEDB.12.0驱动程序的,你得到这里下载: https://www.microsoft.com/zh-cn/download/details.aspx?id=13255

在连接.accdb文件时,一定要对上版本,如果你安装的引擎是32位的,应用程序应该生成为x86版本,如果安装的引擎是64位的,那么,你的应用程序应生成x64版本。

有大伙伴朋友一定会问了,那有没有办法判断系统是否带有特定的提供程序,如果没有,可提示用户安装?答案自然是肯定的,来来来,先看看这个例子。

看代码:

            OleDbDataReader reader = OleDbEnumerator.GetRootEnumerator();
DataTable table = new DataTable();
table.Load(reader);
dataGridView1.DataSource = table.DefaultView;

或者,可以这样:

            OleDbEnumerator enumerator = new OleDbEnumerator();
DataTable dt = enumerator.GetElements();
dataGridView1.DataSource = dt.DefaultView;

这样一耍,就会把当前所支持的OLEDB的提供程序都列出来了。如下图。

其中,SOURCES_NAME列就是提供程序的名称,所以,在程序代码中,只要检测一下你要的提供程序是否存在,就可以知道有没有安装相关的引擎了。

比如,下面代码验证一下当前运行环境是否可以连接.accdb文件。

            string accdbPrd = "Microsoft.ACE.OLEDB.12.0";
OleDbEnumerator enu = new OleDbEnumerator();
DataTable dtprd = enu.GetElements();
// Linq
var qr = from r in dtprd.AsEnumerable()
where r.Field<string>("SOURCES_NAME") == accdbPrd
select r;
if (qr.Count() == )
MessageBox.Show("唉,还没安装相关的提供程序。");
else
MessageBox.Show("可以连接数据库了。");

二、如何连接.accdb文件

这个在上面说过了,只要把连接字符串中的Provider改为Microsoft.ACE.OLEDB.12.0就可以了,或者参考上面老周给的那个网站的信息,反正这个你都会的。

三、关于|DataDirectory|占位符

Data Source设置的是数据库文件的路径,为了方便,通常会这样写:Data Source= |datadirectory|\\mydb.accdb。DataDirectory占位符是不区分大小写的。默认条件下,对于Web项目,datadirectory指向项目目录下的App_Data,这是ASP.NET的惯例,老周不多介绍了。对于其他应用而言,datadirectory指向应用程序运行的目录,如果程序是在\bin\debug目录下运行,那么数据目录就是\bin\debug。

不过呢,datadirectory是可以更改的,下面例子把数据目录改为当前登录用户的“文档”目录。

            string docpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
AppDomain.CurrentDomain.SetData("DataDirectory", docpath);

调用AppDomain的SetData方法就可以修改|datadirectory|占位符所指向的数据目录。现在我把.accdb文件放到我的用户名下的“文档”下,即C:\Users\<my name>\Documents。

接着连接字符串可以这样写:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\pigstore.accdb

实际指向的文件路径为:C:\Users\<my name> \Documents\pigstore.accdb。

好了好了,有用的东西就讲到这里了,没用的话老周已省略,本文就写到这里了,该去填肚子了。

最新文章

  1. 百度地图api
  2. MySQL binlog的格式解析
  3. Python中remove,del和pop的区别
  4. mysql中select五种子句和统计函数
  5. dubbo,gradle,spring build from source
  6. 微软 Visual Studio 14 CTP2 发布
  7. 布局神器:Flexbox
  8. Eclipse代码提示功能设置(Java &amp; Eclipse+CDT C/C++)
  9. 10 个十分难得的 javascript 开发经验
  10. mysql之数据类型
  11. iOS之 LLDB调试常用命令
  12. jQuery中live函数的替代-【jQuery】
  13. 分布式高性能消息系统(Kafka MQ)的原理与实践
  14. c语言学习5
  15. [administrative][archlinux][netctl][wpa_supplicant] 查看WIFI链接信息
  16. 4. Father&#39;s Impact on a Child&#39;s Language Development 父亲对孩子语言发展的影响
  17. web程序打包详解
  18. A Game(区间DP)
  19. HTML5调用百度地图API获取当前位置并直接导航目的地的方法
  20. ConcurrentHashMap实现解析

热门文章

  1. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
  2. ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现&ldquo;开发者异常页面&rdquo;
  3. ABP入门系列(2)——通过模板创建MAP版本项目
  4. 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)
  5. ExtJS 4.2 Date组件扩展:添加清除按钮
  6. Adaboost提升算法从原理到实践
  7. CRL快速开发框架系列教程三(更新数据)
  8. php报错 ----&gt; Call to undefined function imagecreatetruecolor()
  9. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
  10. ASP.NET中常用的优化性能的方法