通过 ODBC 连接到 DB2 时出错

Error connecting to DB2 via ODBC

我在通过 ODBC 连接到 DB2 数据库时遇到问题。我在 Windows 系统上,并在 ODBC 管理器中配置了数据源名称。当我在那里测试连接时,我得到 Connection tested successfully.。我还可以使用 CLI 和 ODBC 在 IBM 的 DB2 Configuration Assistant 中成功测试连接。

我无法在 R 中连接。我已经尝试了 RODBC 和 odbc 包,结果是一样的。我的目的是执行一个简单的查询来验证连接。当我 运行 以下 R 脚本时,出现错误。这是我的伪代码。

library('RODBC')

myQuery <- 'SELECT COLUMN1, COLUMN2 FROM DATABASE.TABLE FETCH FIRST 10 ROWS ONLY;'

cnxn <- odbcConnect('myDSN')

data <- sqlQuery(channel=cnxn, query=myQuery)

odbcCloseAll()

这是我得到的错误。

Error in sqlQuery(channel = cnxn, query = myQuery) : 
  first argument is not an open RODBC channel
In addition: Warning messages:
1: In RODBC::odbcDriverConnect("DSN=myDSN") :
  [RODBC] ERROR: state 58031, code -1031, message [IBM][CLI Driver] SQL1031N  The database directory cannot be found on the indicated file system.  SQLSTATE=58031
2: In RODBC::odbcDriverConnect("DSN=myDSN") : ODBC connection failed

我通过实验了解到我的脚本永远不会到达发送查询的地步。此错误是在 odbcConnect 命令中生成的。

我无权访问服务器本身,只能访问数据库。有什么我可以做或尝试自己解决的,而无需通过支持吗?

编辑:

我现在 cataloged my database,并且在 3 个地方测试连接成功,ODBC 数据源管理器、Db2 命令行和 Db2 配置助手。我知道权限没有问题,因为我可以通过 IBM 查询管理工具执行查询。我相信这是我的驱动程序或系统的 PATH 语句的问题,但我不确定如何追查。

根据 DB2 手册here

SQL1031N 在指示的文件系统上找不到数据库目录。

说明

找不到系统数据库目录或本地数据库目录。数据库尚未创建或未正确编目。 无法处理命令。

用户响应

验证数据库是使用正确的路径规范创建的。 Catalog Database 命令有一个路径参数,它指定数据库所在的目录。

sqlcode:-1031
sqlstate: 58031

采用非 RODBC 方法,以下方法适用于连接 R 和 DB2。假设您了解以下所有信息,您将需要下载一个 IBM DB2 jar 文件并找到它,在本例中,它位于我机器上名为 "IBM" 的文件夹中。

注意:有两种类型的可用 jar 文件,db2jcc.jar 和 db2jcc4.jar。下面的示例使用 db2jcc.jar.

library(rJava)
library(RJDBC)
library(DBI)

#Enter the values for you database connection
dsn_driver = "com.ibm.db2.jcc.DB2Driver"
dsn_database = ""                   # e.g. "BLUDB"
dsn_hostname = ""                   # e.g.: "awh-yp-small03.services.dal.bluemix.net"
dsn_port = ""                       # e.g. "50000" 
dsn_protocol = "TCPIP"              # i.e. "TCPIP"
dsn_uid = ""                        # e.g. "dash104434"
dsn_pwd = ""                        # e.g. "7dBZ39xN6$o0JiX!m"

jcc = JDBC("com.ibm.db2.jcc.DB2Driver", "C:/Program Files/IBM/SQLLIB/java/db2jcc.jar");
jdbc_path = paste("jdbc:db2://",  dsn_hostname, ":", dsn_port, "/", dsn_database, sep="");
conn = dbConnect(jcc, jdbc_path, user=dsn_uid, password=dsn_pwd)

query = "SELECT * 
         FROM Table
         FETCH FIRST 10 ROWS ONLY";
rs = dbSendQuery(conn, query);
df = fetch(rs, -1);
df