尝试从Ruby程序连接到MS Access数据库时出现错误:“在'require'中:无法加载此类文件-win32ole(LoadError)“

Joh*_*ohn 5 ruby windows ubuntu ms-access dbconnection

通过我在Ubuntu下运行的Ruby程序,我试图连接到另一台运行Windows的计算机上的Access数据库。我收到错误

'要求':无法加载此类文件-Win32ole(LoadError)

我面临的另一个问题是系统上不存在Access文件,因此在这里我要使用文件所在的系统中的ip addressand port numberuser nameand password,以便通过Internet连接可以连接并获取数据。不幸的是,我不知道在下面的代码中可以在哪里指定这些详细信息。

connect_to_access_db.rb

require 'win32ole'

connection = WIN32OLE.new('ADODB.Connection')
connection.Open('Provider=Microsoft.ACE.OLEDB.12.0;
             Data Source=c:\path\filename.accdb')


SQLstatement = "SELECT * FROM TABLE"
recordset = WIN32OLE.new('ADODB.Recordset')
res = recordset.Open(SQLstatement, connection)
p res
Run Code Online (Sandbox Code Playgroud)

如何建立与Access数据库的连接?

Gor*_*son 4

你的问题有三个:

1.尝试在非Windows机器上使用win32ole/OLEDB

您很有可能根本无法win32ole在非 Windows 计算机上运行的 Ruby 应用程序中使用它。即使可以,您的代码也需要 OLEDB 提供程序才能在您的 Linux 机器上进行访问,我怀疑这样的东西是否存在。

2.连接数据库文件

在这里我想使用ip addressandport number

你不能那样做。为了连接到远程计算机上的 Access 数据库,您需要连接到 Windows 共享文件夹,而不是 TCP 端口。因此,在 Windows 服务器上您将拥有一个共享文件夹,而在 Linux 客户端上您将挂载该文件夹。

3. 数据库访问

如果win32ole不可用,那么您需要使用其他一些数据库访问技术。ODBC 是一种常见的选择,但不幸的是,Linux 上对 Access 数据库的 ODBC 支持(通过“mdb 工具”和“unixODBC”)相当不可靠,至少根据我的经验是这样。

解决方案

对于您的情况,我倾向于尝试使用JRubyUCanAccess JDBC 驱动程序。我刚刚使用 JRuby 代码在我的 Ubuntu 14.04 LTS 机器上成功测试了它......

connUrl = "jdbc:ucanaccess:///mnt/weezerpublic/uca301demo.accdb"
conn = java.sql.DriverManager.get_connection(connUrl)
stmt = conn.create_statement
rs = stmt.execute_query("SELECT TextField FROM myTableInAccess WHERE ID=1")
while (rs.next) do
    puts rs.getString("TextField")
end
conn.close
Run Code Online (Sandbox Code Playgroud)

...通过 shell 脚本调用...

#!/bin/bash

export CLASSPATH=.:/home/gord/Downloads/JDBC/UCanAccess/loader/ucanload.jar

jruby jrubyTest.rb
Run Code Online (Sandbox Code Playgroud)

...但有以下警告:

  1. Windows 文件共享无法通过普通的 Internet 连接进行。您需要 VPN 连接才能通过 Internet 访问此类共享文件夹。
  2. UCanAccess JDBC 驱动程序对于从多个进程对数据库的并发写入访问有很大的限制。如果您的 Ruby 应用程序必须支持需要更新(而不仅仅是读取)数据库的多个并发用户,那么您最好使用其他数据库(例如 Microsoft SQL Server、MySQL 等)作为后端。