2015-07-20 44 views
5

我使用的是提供的ODBC驱动程序和RODBC封装测试一个新的数据库系统。RODBC连接变得无效

我遇到的问题是,只有少数查询(所有的2〜3分钟或更短的时间跨度内)后,连接不再由R.识别为有效

具体而言,仅在RODBC包,其中RODBCcheckchannel抱怨单个C功能。它是由sqlQuery()


间接调用的RODBC::sqlQuery呼叫

if (!odbcValidChannel(channel)) 
    stop("first argument is not an open RODBC channel") 

odbcValidChannel检查channel三个属性的第一行。
我可以证实,在R回报TRUE做了两次检查。
这是最后一次检查,.Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id"))返回FALSE

源代码RODBCcheckchannel如下

SEXP RODBCcheckchannel(SEXP chan, SEXP id) 
{ 
    SEXP ptr = getAttrib(chan, install("handle_ptr")); 
    pRODBCHandle thisHandle = R_ExternalPtrAddr(ptr); 

    return ScalarLogical(thisHandle && TYPEOF(ptr) == EXTPTRSXP && 
     thisHandle->channel == asInteger(chan) && 
     thisHandle->id == asInteger(id)); 
} 

我一直在使用R -d valgrind尝试过,但因为C代码不会崩溃每本身,这没有帮助。

有人可以说一些为什么.Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id"))返回TRUE一会儿然后返回FALSE
它与手柄有关吗?

(道歉缺乏可重复性exmample的,因为这将需要访问一个非常具体的数据库系统)

+0

猜测:也许数据库正在关闭连接? –

+0

只是 - 这里没有足够的信息。 ODBC具有跟踪/日志记录功能 - 您应该启用此功能,尝试重新创建错误并查看所发现的内容。缺乏这一点...最起码,解决诸如此类的问题通常需要知道有问题的DBMS和驱动程序的名称和版本,有时候双方的主机操作系统以及其他各种细节......我们在这里没有。 – TallTed

+1

我可以提供的唯一的事情是,我经历了一段时间后关闭连接的远程数据库,但是我已经看到(使用Oracle)使用RODBC和ROracle,并且它始终是远程数据库执行此操作。 – joran

回答

0

你可以添加跟踪到下面的代码?如果是这样,那么打印出thisHandle,TYPEOF(ptr),thisHandle-> channel,thisHandle-> id的值可以查看发生了什么变化?

SEXP RODBCcheckchannel(SEXP chan, SEXP id) 
{ 
    SEXP ptr = getAttrib(chan, install("handle_ptr")); 
    pRODBCHandle thisHandle = R_ExternalPtrAddr(ptr); 

    return ScalarLogical(thisHandle && TYPEOF(ptr) == EXTPTRSXP && 
     thisHandle->channel == asInteger(chan) &&thisHandle->id == asInteger(id)); 
}