【.net 深呼吸】连接Access数据库应注意的几点
本地数据库可以有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。
好了好了,有用的东西就讲到这里了,没用的话老周已省略,本文就写到这里了,该去填肚子了。
【.net 深呼吸】连接Access数据库应注意的几点的更多相关文章
- C#连接Access数据库(详解)
做一个用VS2012的C#连接Access数据库的备忘, SQL数据库固然强大,有大微软的强力技术支持,LINQ的方便操作,但是如果写一个小程序对数据库方面没有什么大的要求的话,将来在数据库方面就可以 ...
- ASP.net分别连接SQLserver数据库与连接Access数据库精英版
-------------------------连接access2003 字符串------------------------- Provider=Microsoft.Jet.OLEDB.4.0; ...
- php连接Access数据库错误及解决方法
<?php $connstr="DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("data.m ...
- php连接Access数据库的三种方法
http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2009/1115/3524.html 虽然不是一个类但先放这儿吧 最近想把一个asp的网站改成 ...
- 三种php连接access数据库方法
种是利用php的pdo,一种是odbc,com接口来与access数据库连接.利用pdo与access数据库连接 $path ="f:fontwww.jb51.netspiderresult ...
- 具体解释VB中连接access数据库的几种方法
在VB中,连接ACCESS数据库的方法主要有以下三种 使用ADO对象,通过编写代码訪问数据库 Connection 对象 ODBC数据源 使用ADO Data 控件高速创建数据库连接 有三种连接方法 ...
- C# 连接 Access 数据库
c#连接Access 数据库需要System.Data, System.Data.OleDb using System.Data using System.Data.OleDb public OleD ...
- JSP连接access数据库
一个用jsp连接Access数据库的代码. 要正确的使用这段代码,你需要首先在Access数据库里创建一username表,表里面创建两个字符型的字段,字段名分别为:uid,pwd,然后插入几条测试数 ...
- Java Web项目中连接Access数据库的配置方法
本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...
随机推荐
- Angular杂谈系列1-如何在Angular2中使用jQuery及其插件
jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...
- Shell替换
如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...
- SSH实战 · 唯唯乐购项目(上)
前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- 前端学HTTP之web攻击技术
前面的话 简单的HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标.本文将详细介绍攻击web站点 ...
- jquery.Callbacks的实现
前言 本人是一个热爱前端的菜鸟,一直喜欢学习js原生,对于jq这种js库,比较喜欢理解他的实现,虽然自己能力有限,水平很低,但是勉勉强强也算是能够懂一点吧,对于jq源码解读系列,博客园里有很多,推荐大 ...
- 【开源】.Net Api开放接口文档网站
开源地址:http://git.oschina.net/chejiangyi/ApiView 开源QQ群: .net 开源基础服务 238543768 ApiView .net api的接口文档查看 ...
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- 如何为你的微信小程序体积瘦身?
众所周知,微信小程序在发布的时候,对提交的代码有1M大小的限制!所以,如果你正在写一个功能稍微复杂一点的小程序,就必须得时刻小心注意你的代码是不是快触及这个底线了. 在设计一个小程序之初,我们就需要重 ...
- Idea下用SBT搭建Spark Helloworld
没用过IDEA工具,听说跟Eclipse差不多,sbt在Idea其实就等于maven在Eclipse.Spark运行在JVM中,所以要在Idea下运行spark,就先要安装JDK 1.8+ 然后加入S ...