我正在使用提供的ODBC驱动程序和RODBC包测试一个新的数据库系统。
我遇到的问题是,经过几个查询(都在2~3分钟或更短的时间内),R.不再承认该连接是有效的
具体来说,它只是RODBC包中的一个RODBC函数,也就是抱怨的RODBCcheckchannel。它由sqlQuery()间接调用。
RODBC::sqlQuery调用的第一行
if (!odbcValidChannel(channel))
stop("first argument is not an open RODBC channel")channel. odbcValidChannel 检查的三个属性
我可以确认在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**?**,能不能解释一下?
这跟把手有关系吗?
(对缺乏可复制的外部设备表示歉意,因为这将需要访问非常具体的数据库系统)
发布于 2015-07-20 23:27:18
可以将跟踪添加到以下代码中吗?如果是这样的话,打印出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));
}https://stackoverflow.com/questions/31521400
复制相似问题