链接 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
- 通过ODBC
在Access
中链接表.
php
和 MySQL
之间的连接很容易,MS Access
和 MySQL
之间的连接也应该是:
为此,每个客户都需要ODBC-MySQL-Provider
才能打开 IT 部门不想安装的数据库。
我们还在Windows Server
上使用MS SQL Server
- 我也可以将php 连接到SQL Server
- 但在这种情况下,我们需要在链接表格时安装ODBC SQL Server Provider
,如果我们去,我们需要安装SQL Server Native Clients
与Ado
。 - 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 中更改表字段的数据类型,而无需创建新表单来更新表?