通过ODBC连接到DB2时出错

问题描述:

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

我无法在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 Query Management Facility执行查询。我相信这是我的驱动程序或我的系统的PATH声明的问题,但我不知道如何跟踪它。

+1

看起来像没有为DB2驱动程序设置应用程序环境。尝试从DB2命令窗口运行R. – mustaccio

+0

我不确定如何在DB2命令窗口中运行R,但您的评论很有帮助。我现在正在设定应用程序环境。 – Lenwood

按照DB2手册here

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

说明

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

用户响应

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

SQLCODE:-1031
SQLSTATE:58031

+0

我已按照[此处](http://db2commerce.com/2011/04/14/how-to-catalog-a-db2-database/)的说明对我的数据库编目,并且后续的测试连接成功。在R内,我仍然遇到同样的错误。 – Lenwood

+0

我终于解决了。您链接的文档可导致解决方案。我必须将我的Win7用户ID添加到DB2ADMNS和DB2USERS组。在快速重新启动后,我成功地抓取了数据。干杯! – Lenwood

以非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 
+0

这适用于我,我可以执行查询。我支持ODBC解决方案,因为这为我解决了许多其他问题。感谢您的协助! – Lenwood