我无法通过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声明的问题,但我不知道如何追踪它。
答案 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