2015-07-20 17 views
5

Sağlanan bir ODBC sürücüsü ve RODBC paketini kullanarak yeni bir veritabanı sistemini test ediyorum.RODBC Bağlantısı geçersiz

Ben karşılaşmamdır meselenin, (hepsi 2 ~ 3 dakika veya daha az sürede içinde) sadece birkaç sorguları sonra, bağlantı artık

Özellikle R. tarafından geçerli olarak kabul olmasıdır RODBC paketinde C numaralı tek bir paket olup, RODBCcheckchannel numaralı paketin şikayetçisidir. Bu RODBC::sqlQuery aramalar

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

odbcValidChannelkontrol channel üç özellikleri ilk satırı sqlQuery()


dolaylı olarak adlandırılır.
R'da yapılan iki denetimin TRUE döndürdüğünü onaylayabilirim.
C kod beri kilitleniyor değil ben R -d valgrind kullanarak denedi

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)); 
} 

takip eder, fakat gibi RODBCcheckchannel için FALSE

Kaynak kodunu döndürür son onay, .Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id")) mesafesindedir başına se, Bu yardımcı olmadı. Sonra FALSE döndürür iken

birisi kısa .Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id")) getiri TRUE neden olarak ışık döken ?
Tutamakla ilgisi var mı?

aşağıdaki koda izleme ekleyebilir miyim

+0

Tahmin: belki de DB bağlantıyı kapatıyor mu? –

+0

Sadece - burada yeterli bilgi yok. ODBC'nin bir izleme/kayıt özelliği vardır - bunu etkinleştirmeniz, hatayı yeniden oluşturmaya çalışmanız ve ne bulduğunuzu görmeniz gerekir. Bunun olmaması ... Minimal olarak, bu gibi sorun giderme sorunları genellikle söz konusu DBMS ve Sürücü adının ve sürümünün, bazen her iki tarafta da ana işletim sisteminin ve diğer çeşitli ayrıntıların ... bilmemizi gerektirir. . – TallTed

+1

Sunabileceğim tek şey, bir süre sonra uzak DB'lerin bağlantılarını kapattığımı yaşadım, ancak RODBC ve ROracle kullanarak (Oracle ile) bunu gördüm ve her zaman uzak DB bunu yapıyor. – joran

cevap

0

(bu kadar tekrarlanabilir exmample olmaması için kusura bakmayın çok spesifik bir veritabanı sistemine erişim gerektirir)? Eğer öyleyse, neyin değiştiğini görmek için thisHandle, TYPEOF (ptr), thisHandle-> channel, thisHandle-> id değerlerini basmak yararlı olur mu?

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)); 
} 
İlgili konular