Ограничение в odbcCloseAll - PullRequest
       0

Ограничение в odbcCloseAll

2 голосов
/ 15 декабря 2011

Мой R-скрипт должен выполнять множество операций открытия / записи / закрытия / открытия / чтения / закрытия в Excel, а посередине я использую пакет RODBC. Кажется, есть проблема с odbcCloseAll, которая не закрывает открытые соединения Excel через несколько раз. Простой пример (надеюсь, воспроизводимый, и не только потому, что мой компьютер странный):

require(RODBC)
filename <- tempfile(fileext='.xls')
for(i in 1:100) {
xlsFile <- odbcConnectExcel(filename, readOnly=FALSE)
sqlSave(xlsFile, USArrests, rownames = FALSE)
odbcCloseAll()
xlsFile <- odbcConnectExcel(filename, readOnly=FALSE)
template <- sqlFetch(xlsFile, "USArrests")
odbcCloseAll()
file.remove(filename)
}

И в какой-то момент (около i = 50 в моем случае) цикл завершается с:

Error in sqlSave(xlsFile, USArrests, rownames = FALSE) : 
  table ‘USArrests’ already exists
In addition: Warning message:
In file.remove(filename) :
  cannot remove file 'c:\DOCUME~1\user\LOCALS~1\Temp\RtmpSFDDiG\file43522f58.xls', reason 'Permission denied'

Проблема может быть легко решена с помощью odbcClose(xlsFile) или любого другого пакета, связанного с Excel, но ради правильности мне интересно, что не так с odbcCloseAll ...

1 Ответ

2 голосов
/ 16 декабря 2011

Нашел его, в источнике C, есть ошибка в коде C:

 SEXP RODBCCloseAll(void)
 {
     int i;

     for(i = 1; i <= my_min(nChannels, 100); i++) <<<===== error
        if(opened_handles[i])
                  inRODBCClose(opened_handles[i]);

     return R_NilValue;
 }

должно быть

 SEXP RODBCCloseAll(void)
 {
     int i;

     for(i = 1; i <= my_min(nChannels, 1000); i++) <<<=====
        if(opened_handles[i])
              inRODBCClose(opened_handles[i]);

     return R_NilValue;
 }

Я напишу разработчику. В то же время вы можете восстановить пакет с этим изменением. Ошибка в строке 1235.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...