2017-07-06 185 views
0

我在通過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

回答

1

按照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

1

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