gpt4 book ai didi

RODBC 连接失效

转载 作者:行者123 更新时间:2023-12-03 17:43:03 26 4
gpt4 key购买 nike

我正在使用提供的 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 ?
跟 handle 有关系吗?

(对于缺乏可重现的示例表示歉意,因为这需要访问非常特定的数据库系统)

最佳答案

您可以在以下代码中添加跟踪吗?如果是这样,打印出 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));
}

关于RODBC 连接失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31521400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com