链接 MS Access 和数据库服务器,无需安装任何额外的驱动程序

Posted

技术标签:

【中文标题】链接 MS Access 和数据库服务器,无需安装任何额外的驱动程序【英文标题】:Linking MS Access and database server without installing any additional drivers 【发布时间】:2016-01-26 15:47:53 【问题描述】:

在我们的公司网站上,我们有一个html-form,其中出于咨询原因通过php 生成了一封电子邮件 - 效果很好。我的上级要我将html-form 的信息保存到MS Access-database 中。

我想不出直接从php 写入MS Access 的解决方案 - 所以我说服他们通过phpMyAdmin 使用mysql - 通过ODBCAccess 中链接表.

phpMySQL 之间的连接很容易,MS AccessMySQL 之间的连接也应该是:

为此,每个客户都需要ODBC-MySQL-Provider 才能打开 IT 部门不想安装的数据库。

我们还在Windows Server 上使用MS SQL Server - 我也可以将php 连接到SQL Server - 但在这种情况下,我们需要在链接表格时安装ODBC SQL Server Provider,如果我们去,我们需要安装SQL Server Native ClientsAdo。 - IT 人员:

没有在所有客户端上安装提供程序。

我的问题是:

是否有任何可能的解决方案来访问MySQL/SQL Server 来自MS Access 根本没有安装ODBC-Providers

我对此压力很大,找不到任何可以满足用户需求和期望的东西。

提前致谢

巴里斯

编辑:工作 php/MySQL-代码 - 基于 mysqli

$servername = "----------.de";
$username = "-------";
$password = "--------";
$dbName = "---------";
$port = "-------";

$con= mysqli_connect($servername, $username, $password, $dbName, $port );
if (mysqli_connect_errno())
  
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  

以下连接字符串适用于使用集成的SQLSRV32.dll-provider 从MS Access 连接到服务器端ms sqlserver。感谢戈德汤普森

cs = "Driver=SQL Server;"
cs = cs & "Server=ip-adress,port-number;"
cs = cs & "Database=database-name;"
con.Open cs, "username", "password"

由于可以连接到SQL Server 而无需额外的提供者,我将选择PDO/SQLServer-组合,并根据上面的连接字符串加载数据。

【问题讨论】:

你到底为什么要这样做?使用 PDO 并直接写入 sql server 无需使用 access 或 mysql,因为您已经拥有一个完整的 sql server 甚至更好...网站 php、mysql、内部网站 php 他们可以访问数据通过网络浏览器或通过电子邮件发送给他们,如果他们有那么迟钝 我别无选择,只能使用 MS Access 作为前端数据库。要求很明确,数据最终需要找到通往 MS Access 的途径。我对此也不满意,但关键利益相关者确实希望坚持使用 MS Access,而 SQL Server 和 ODBC 提供程序的问题仍然存在 您需要在每个运行 ms 访问前端数据库的客户端上安装某种驱动程序以连接到 mysql 或 ms sql。如果 IT 拒绝在所有客户端上安装广为人知且经过良好测试的驱动程序,那么他们愿意安装其他驱动程序的机会有多大?顺便说一句,ms access 在默认设置下安装本机 sql server 驱动程序,因为 ms access 项目类型数据库,其中后端在 ms sql 中,但前端在 ms access 中。所以,我会检查是否尚未安装 ms sql 驱动程序。 您可能需要考虑以下设置:a) 将您的 ms access 数据库拆分为 2 个数据库,1 个用于安装在所有客户端上的前端,1 个用于所有数据所在的后端(这是安装在服务器计算机上)。 b) 将后端数据库中的表链接到前端数据库 c) 仅在后端数据库所在的服务器计算机上安装 myodbc 或 ms sql 驱动程序。 d) 仅将您的数据与后端数据库同步。 作为 Windows 本身的标准组件安装的旧版“SQL Server”ODBC 驱动程序 (SQLSRV32.DLL) 怎么样?您的公司是否也将这一点从您手中夺走了? 【参考方案1】:

由于最重要的问题是避免在客户端计算机上安装额外的驱动程序,并且您可以使用 Microsoft SQL Server,因此您可以

    让您的 PHP 脚本将所需信息写入 SQL Server,然后

    创建一个 Access 进程,该进程使用随每个 Windows 副本安装的“SQL Server”ODBC 驱动程序从 SQL Server 检索信息。

【讨论】:

【参考方案2】:

首先,PHP 绝对可以连接到 MS Access 数据库(特别是 Jet/ACE SQL 引擎)。在现代计算中,几乎所有通用语言(C#、Java、PHP、Perl、Python、R、VB)都可以连接到所有流行的关系数据库管理系统(RDMS)——文件级别(SQLite、MS Access)和服务器级别(SQL Server、MySQL、Postgre、Oracle、DB2),每个都使用某种类型的自定义或通用库。

使用 PHP 的PDO,您实际上可以交换连接的后端数据库。因此,无论您连接到 MySQL,您都可以对与其他数据库的这种连接进行建模。 PHP/MySQL 在网络上的流行使它们看起来像是结婚了,但事实并非如此!下面是使用 DSN、驱动程序甚至 PHP 自己的 API sqlsrv 的示例。

MS 访问

# USING DSN
$database="C:\Path\To\Database\File.accdb";
try 
    $dbh = new PDO("odbc:DSN=MS Access Database;DBq=$database;");
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "SELECT * FROM tablename";    
    $STH = $dbh->query($sql);    
    $STH->setFetchMode(PDO::FETCH_ASSOC); 

catch(PDOException $e)   
    echo $e->getMessage()."\n";
    exit;

# close the connection
$dbh = null;


# USING DRIVER (NON-DSN)
$database="C:\Path\To\Database\File.accdb";
try 
    $dbh = new PDO("odbc:Driver=Microsoft Access Driver (*.mdb, *.accdb);DBq=$database;");    
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "SELECT * FROM tablename";    
    $STH = $dbh->query($sql);    
    $STH->setFetchMode(PDO::FETCH_ASSOC); 

catch(PDOException $e)   
    echo $e->getMessage()."\n";
    exit;

# close the connection
$dbh = null;

SQL 服务器

# WITH ODBC DRIVER PDO
try 
    $dbh = new PDO("odbc:Driver=SQL Server;Server=$server;database=$database",$username,$password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "SELECT * FROM dbo.tablename";    
    $STH = $dbh->query($sql);    
    $STH->setFetchMode(PDO::FETCH_ASSOC); 

catch(PDOException $e)   
    echo $e->getMessage()."\n";
    exit;

# close the connection
$dbh = null;

# WITH SQLSRV PDO
try 
    $dbh = new PDO("sqlsrv:server=$server;database=$database",$username,$password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "SELECT * FROM dbo.tablename";    
    $STH = $dbh->query($sql);    
    $STH->setFetchMode(PDO::FETCH_ASSOC); 

catch(PDOException $e)   
    echo $e->getMessage()."\n";
    exit;

# close the connection
$dbh = null;

其他语言连接的额外资源:

https://github.com/ParfaitG/DATABASE_CONNECTIONS

【讨论】:

我看到的问题是连接字符串是如何构建的,即只有一个$database="C:\Path\To\Database\File.accdb"; -> 没有IP,没有服务器端DBMS(SQL Server,MySQL)中的端口。 CMS 和带有MS Access 的客户端计算机不在同一个环境中,所以我假设我们必须给PDO 某种地址(IP)或类似的东西。我不需要告诉PDO 至少在哪里可以找到客户端计算机的文件路径吗? MS Access 是一个文件级数据库,不能通过 IP 远程操作,而是在 LAN 网络上操作。在 PHP 中,您可以使用当前目录值:` $cd = dirname(FILE); $database=$cd.'/File.accdb';` 并相对于脚本保存数据库。如图所示,MS Access 的 PDO 使用已安装的 Access 驱动程序(与 VBA 的 ADO 相同)。 我应该补充一点,因为 Jet/ACE 数据库是 .DLL 文件,MS Access 只能在 Windows 环境中运行。抱歉,如果这一切令人困惑,但如果我们回到您将 HTML 表单保存到 Access 的中心需求,PHP 运行在 PC 服务器而不是 Linux/Unix 上,数据库驻留在服务器上,PHP 可以解析 html 并将数据插入 Access db。请使用有效的 PHP/MySQL 代码更新您的帖子,以便我可以具体向您展示。 php/on server & ms access/on client-pc 这是不可能的,对吧? 再次,MS Access 无法远程连接。如果 Access 文件使用 PHP 驻留在 Windows Web 服务器上,则可以使用上述 PHP/MS Access 脚本。或者,让 PHP 以 HTML/XML/txt/csv 格式保存表单数据,然后通过电子邮件或将文件传输到 FTP,以便 Access VBA(或其他语言)可以在本地下载和导入。相当多的基础架构可以集成企业 RDMS、SQL Server,仅用于 HTML 数据任务。

以上是关于链接 MS Access 和数据库服务器,无需安装任何额外的驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 链接到 SQL 服务器视图

MS Access 表单以更新多个表而无需子表单

MS Access 365 - 创建包含链接文件的子表单

如何在 ms access 中更改表字段的数据类型,而无需创建新表单来更新表?

重新定义 MS Access 文件和 SQL Server 之间的数据链接

从 SQL 2008 R2 到 MS Access 的链接服务器