2015-07-20 8 views
5

Sto testando un nuovo sistema di database utilizzando un driver ODBC fornito e il pacchetto RODBC.Connessione RODBC non valida

Il problema che sto incontrando è che dopo solo un paio di domande (tutte nel giro di 2 ~ 3 minuti o meno), la connessione non viene più riconosciuto valido da R.

In particolare, è solo una singola funzione C nel pacchetto RODBC, RODBCcheckchannel che si lamenta. Si chiama indirettamente da sqlQuery()


La prima linea di RODBC::sqlQuery chiamate

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

odbcValidChannelassegni tre proprietà di channel.
Posso confermare che i due controlli effettuati in R restituiscono TRUE.
E 'l'ultimo controllo, .Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id")) che restituisce il codice FALSE

sorgente per RODBCcheckchannel è la seguente

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

Ho provato con R -d valgrind, ma dal momento che il codice C non è crash per-sé, questo non è stato utile.

Qualcuno può far luce sul motivo per cui i rendimenti .Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id"))TRUE per un breve periodo poi torna FALSE?
Ha qualcosa a che fare con la maniglia?

(Ci scusiamo per la mancanza di exmample riproducibili, come quello richiederebbe l'accesso a un sistema di database molto specifico)

+0

Indovinare: forse il DB sta chiudendo la connessione? –

+0

Semplicemente - non ci sono abbastanza informazioni qui. ODBC ha una funzione di tracciabilità/registrazione: è necessario abilitarlo, provare a ricreare l'errore e vedere cosa trovi. Mancanza che ... In minima parte, la risoluzione dei problemi come questo richiede solitamente conoscere il nome e la versione di DBMS e Driver in questione, a volte il sistema operativo host su entrambi i lati e vari altri dettagli ... che non abbiamo qui . – TallTed

+1

L'unica cosa che posso offrire è che ho sperimentato database remoti che chiudono le connessioni dopo un certo periodo di tempo, ma l'ho visto (con Oracle) usando RODBC e ROracle, ed è sempre il DB remoto a farlo. – joran

risposta

0

Puoi aggiungere tracciando al seguente codice? Se è così, sarebbe utile stampare i valori per questoHandle, TYPEOF (ptr), thisHandle-> channel, thisHandle-> id per vedere cosa è cambiato?

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