我正在使用提供的ODBC驱动程序和RODBC
包测试新的数据库系统。
我遇到的问题是,在经过几次查询后(所有查询都在2~3分钟或更短的时间内),连接不再被R识别为有效。
具体来说,C
包中只有一个RODBC
函数,RODBCcheckchannel
正在抱怨。它由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
吗?
它与手柄有关吗?
(对于缺乏可重现的例子而道歉,因为这需要访问非常具体的数据库系统)
答案 0 :(得分:0)
您可以在以下代码中添加跟踪吗?如果是这样,打印出thisHandle,TYPEOF(ptr),thisHandle->频道,thisHandle-> id的值会有用,看看有什么变化?
<script src="https://code.jquery.com/jquery-1.3.js"></script>
<div id="container"><div id="test"></div></div>