Ruby on rails 4 带有Ruby on Rails的AS400

Ruby on rails 4 带有Ruby on Rails的AS400,ruby-on-rails-4,ibm-midrange,Ruby On Rails 4,Ibm Midrange,我正在尝试使用RubyonRails访问AS400数据库,使用“dbi”gem和“dbd odbc”gem 我发现这段代码是以它为基础构建的。当我传入服务器地址时。。。 原始代码似乎使用了DSN,但我想在代码中传入IP、数据库名称和库,以防止需要任何DSN require 'dbi' dbh = DBI.connect('DBI:ODBC:SYSTEM=<ip_address>;DBQ=<db_name>;DFTPKGLIB=<library_name>;LA

我正在尝试使用RubyonRails访问AS400数据库,使用“dbi”gem和“dbd odbc”gem

我发现这段代码是以它为基础构建的。当我传入服务器地址时。。。 原始代码似乎使用了DSN,但我想在代码中传入IP、数据库名称和库,以防止需要任何DSN

require 'dbi'
dbh = DBI.connect('DBI:ODBC:SYSTEM=<ip_address>;DBQ=<db_name>;DFTPKGLIB=<library_name>;LANGUAGEID=ENU', 'UID=<user_name>', 'PWD=<password>')
sth = dbh.prepare('select count(*) from my_table')
sth.execute

# Print out each row
while row=sth.fetch do
  p row
end

sth.finish
dbh.disconnect

正确的语法应该是什么?

我不知道在Ruby中是如何工作的,但是在连接字符串中,我看不出您在哪里提到了试图用于连接的驱动程序

好像这句话:

dbh = DBI.connect('DBI:ODBC:SYSTEM=<ip_address>;DBQ=<db_name>;DFTPKGLIB=<library_name>;LANGUAGEID=ENU', 'UID=<user_name>', 'PWD=<password>')
dbh=DBI.connect('DBI:ODBC:SYSTEM=;DBQ=;DFTPKGLIB=;LANGUAGEID=ENU','UID=','PWD='))
需要如下所示,以指示ODBC用于连接的驱动程序:

dbh = DBI.connect('DBI:ODBC:Driver=iSeries Access ODBC Driver;SYSTEM=<ip_address>;DBQ=<db_name>;DFTPKGLIB=<library_name>;LANGUAGEID=ENU', 'UID=<user_name>', 'PWD=<password>')
dbh=DBI.connect('DBI:ODBC:Driver=iSeries-Access-ODBC-Driver;SYSTEM=;DBQ=;DFTPKGLIB=;LANGUAGEID=ENU','UID=','PWD=')

这对我很有用-另外,只需将身份验证部分放在DBI.connect函数的第一个参数中:

首先安装gems:dbi、dbd-odbc、ruby-odbc。没有ruby odbc gem,我也会遇到同样的错误

然后:


我的印象是,对于dbi gem和did odbc gem,服务器上不需要安装DSN。我目前正在开发中,我不想这样做,所以我必须依靠生产服务器来安装DSN。如果dbi和odbc gems都有驱动程序,那么DSN就不需要了,这一想法正确吗?DSN基本上就是连接字符串中应用了名称的所有内容。但是,您必须确保服务器安装了驱动程序。
dbh = DBI.connect('DBI:ODBC:Driver=iSeries Access ODBC Driver;SYSTEM=<ip_address>;DBQ=<db_name>;DFTPKGLIB=<library_name>;LANGUAGEID=ENU', 'UID=<user_name>', 'PWD=<password>')
require 'odbc'

require 'dbi'

dbh = DBI.connect('DBI:ODBC:SYSTEM=MYAS400;DBQ=TABLE_NAME;DFTPKGLIB=SCHEMA_NAME;DRIVER=Client Access ODBC Driver (32-bit);LANGUAGEID=ENU;USERID=SUPERADMIN;PWD=SUPERSECURE')