2011-05-18 69 views
1

使用RODBC軟件包的功能,我成功​​創建了一個ODBC,但在嘗試查詢數據庫時收到錯誤消息。我正在使用INFORMIX 3.31 32位驅動程序(版本3.31.00.10287)。使用Informix驅動程序在R中使用ODBC連接時的SQL查詢錯誤

channel <- odbcConnect("exampleDSN") 
unclass(channel) 
[1] 3 
attr(,"connection.string") 
[1] "DSN=exampleDSN;UID=user;PWD=****;DB=exampleDB;HOST=exampleHOST;SRVR=exampleSRVR;SERV=exampleSERV;PRO=onsoctcp ... (more parameters)" 
attr(,"handle_ptr") 
<pointer: 0x0264c098> 
attr(,"case") 
[1] "nochange" 
attr(,"id") 
[1] 4182 
attr(,"believeNRows") 
[1] TRUE 
attr(,"colQuote") 
[1] "\"" 
attr(,"tabQuote") 
[1] "\"" 
attr(,"interpretDot") 
[1] TRUE 
attr(,"encoding") 
[1] "" 
attr(,"rows_at_time") 
[1] 100 
attr(,"isMySQL") 
[1] FALSE 
attr(,"call") 
odbcDriverConnect(connection = "DSN=exampleDSN") 

當我嘗試查詢和調查返回的對象的結構時,收到錯誤訊息「CHR [1:2]「42000 -201 [Informix的] [Informix ODBC驅動程序] [Informix的一種語法錯誤已經發生。「 ...'

具體來說,我寫了一個表達式來遍歷數據庫中的所有表,檢索10行,並調查返回對象的結構。

for (i in 1:153){res <- sqlFetch(channel, sqlTables(channel, tableType="TABLE")$TABLE_NAME[i], max=10); str(res)} 

每次迭代都會返回相同的錯誤消息。任何想法從哪裏開始?

附加信息:當我返回對象「水庫」,我收到以下 -

> res 
[1] "42000 -201 [Informix][Informix ODBC Driver][Informix]A syntax error has occurred." 
[2] "[RODBC] ERROR: Could not SQLExecDirect 'SELECT * FROM \"exampleTABLE\"'" 
+0

當你查詢單個表時會發生什麼? – Chase 2011-05-18 20:13:48

+0

@Chase:不管表是什麼,當我查詢單個表(並將查詢結果分配給'res')時,我收到與上面相同的錯誤消息(除了'exampleTABLE'是表的實際名稱)。 – Jubbles 2011-05-18 20:27:14

+0

嗯...你有沒有嘗試過任何其他功能來檢索結果?也許'sqlQuery(通道,「從exampleTABLE選擇前10 *)'? – Chase 2011-05-18 20:40:09

回答

1

您可以嘗試使用RODBC中的sqlQuery()函數來檢索結果。這是我在工作中使用和從未有過出了問題的功能:

sqlQuery(channel, "select top 10 * from exampleTABLE") 

你應該可以把你所有的查詢到一個列表,並遍歷它們作爲你面前:

dat <- lapply(queries, function(x) sqlQuery(channel, x)) 

其中查詢是您的查詢列表,頻道是您打開的ODBC連接。我想我也應該鼓勵你在完成時關閉連接odbcCloseAll()

2

你引用的錯誤信息是:

"[RODBC] ERROR: Could not SQLExecDirect 'SELECT * FROM \"exampleTABLE\"'" 

的Informix只承認用雙表名如果在服務器或客戶端(或兩者)的環境中設置環境DELIMIDENT,則會引用引號。它並不重要,當我想要分隔標識符時,我使用DELIMIDENT=1

您是如何在Informix數據庫中創建表的?除非您使用DELIMIDENT集創建表,否則表名不區分大小寫;你不需要圍繞表名引用。

事實上,你得到錯誤-201意味着你已經通過連接過程;這是一個好的開始,並且簡化後面的內容。

我不確定您是在Unix機器上還是在Windows機器上 - 它通常有助於指出這一點。在Windows上,您可能必須使用SETNET32(一個Informix程序)設置環境,或者可能有方法在連接字符串中指定DELIMIDENT。在Unix上,您可能將其設置在您的環境中,而R軟件將其選中。但是,如果在GUI環境中通過某種菜單按鈕或選項啓動R,則可能會出現問題;有可能在R程序之前沒有執行配置文件。

+0

我不是數據庫表的創建者。對不起,我沒有指定我的操作系統;它是Windows XP Professional Version 2002.我實際上嘗試了@Chase(使用帶有SQL字符串的sqlQuery)的建議,它工作正常。 – Jubbles 2011-05-19 13:49:50

相關問題