通过ODBC连接到DB2时出错

时间:2017-07-06 11:32:55

标签: r db2 odbc rodbc dsn

我无法通过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命令行&amp; Db2配置助手。我知道权限没有问题,因为我可以通过IBM Query Management Facility执行查询。我相信这是我的驱动程序或我的系统的PATH声明的问题,但我不知道如何追踪它。

2 个答案:

答案 0 :(得分:1)

根据DB2手册here

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

<强>解释

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

用户回复

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

sqlcode:-1031
sqlstate:58031

答案 1 :(得分:1)

采用非RODBC方法,以下方法适用于连接R和DB2。假设您知道下面的所有信息,您需要下载IBM DB2 jar文件并在本例中将其定位在我的机器上名为&#34; IBM&#34;的文件夹中。

注意:有两种类型的可用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