1

RODBCパッケージの機能を使用して、ODBCを正常に作成しましたが、データベースにクエリを実行しようとするとエラーメッセージが表示されます。INFORMIX 3.31 32ビットドライバー(バージョン3.31.00.10287)を使用しています。

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 ODBCDriver][Informix]構文エラーが発生しました。"が表示されます。...」

具体的には、データベース内のすべてのテーブルをループし、10行を取得して、返されたオブジェクトの構造を調査する式を作成しました。

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

各反復は同じエラーメッセージを返します。どこから始めればいいですか?

追加情報:オブジェクト'res'を返すと、次のようになります-

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

2 に答える 2

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プログラムが実行される前にプロファイルが実行されない可能性があります。

于 2011-05-18T22:43:44.577 に答える
1

sqlQuery()RODBCの関数を使用して、結果を取得してみてください。これは私が仕事で使用している機能であり、問​​題が発生したことはありません。

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

すべてのクエリをリストに入れて、以前と同じように繰り返すことができるはずです。

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

ここで、querysはクエリのリストであり、channelは開いているODBC接続です。私はまた、あなたが終わったときにあなたが言った接続を閉じることをあなたに勧めるべきだと思いますodbcCloseAll()

于 2011-05-19T13:58:29.543 に答える