zoukankan      html  css  js  c++  java
  • 【.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() == 0)
                    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指向应用程序运行的目录,如果程序是在indebug目录下运行,那么数据目录就是indebug。

    不过呢,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> Documentspigstore.accdb。

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

  • 相关阅读:
    AGC037F Counting of Subarrays
    AGC025F Addition and Andition
    CF506C Mr. Kitayuta vs. Bamboos
    AGC032D Rotation Sort
    ARC101F Robots and Exits
    AGC032E Modulo Pairing
    CF559E Gerald and Path
    CF685C Optimal Point
    聊聊Mysql索引和redis跳表
    什么是线程安全
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/5775231.html
Copyright © 2011-2022 走看看