2015-07-20 20 views
5

Tôi đang thử nghiệm một hệ thống cơ sở dữ liệu mới bằng cách sử dụng trình điều khiển ODBC được cung cấp và gói RODBC.Kết nối RODBC trở thành không hợp lệ

Vấn đề tôi gặp phải là sau khi chỉ có một vài thắc mắc (tất cả trong khoảng thời gian 2 ~ 3 phút hoặc ít hơn), kết nối không còn được công nhận là hợp lệ bởi R.

Cụ thể, nó chỉ là một hàm C duy nhất trong gói RODBC, RODBCcheckchannel đang bị khiếu nại. Nó được gọi là gián tiếp bởi sqlQuery()


Dòng đầu tiên của cuộc gọi RODBC::sqlQuery

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

odbcValidChannelkiểm tra ba thuộc tính của channel.
Tôi có thể xác nhận rằng hai séc được thực hiện trong R trả lại TRUE.
Nó được kiểm tra cuối cùng, .Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id")) mà trả về mã FALSE

Nguồn RODBCcheckchannel như sau

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

Tôi đã cố gắng sử dụng R -d valgrind, nhưng kể từ khi mã C không được đâm mỗi se, điều này không hữu ích.

Ai đó có thể làm sáng tỏ vì sao .Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id")) lợi nhuận TRUE cho một thời gian ngắn sau đó trả về FALSE?
Nó có liên quan gì đến tay cầm không?

(Xin lỗi cho việc thiếu exmample tái sản xuất, vì điều đó sẽ đòi hỏi quyền truy cập vào một hệ thống cơ sở dữ liệu rất cụ thể)

+0

Đoán: có lẽ DB đang đóng kết nối? –

+0

Đơn giản - không có đủ thông tin ở đây. ODBC có cơ sở truy tìm/ghi nhật ký - bạn nên kích hoạt tính năng này, cố gắng tạo lại lỗi và xem những gì bạn tìm thấy. Thiếu ... Các vấn đề khắc phục sự cố như vậy thường đòi hỏi phải biết tên và phiên bản của cả DBMS và Driver được đề cập, đôi khi hệ điều hành chủ trên cả hai mặt và nhiều chi tiết khác ... mà chúng tôi không có ở đây . – TallTed

+1

Điều duy nhất tôi có thể cung cấp là tôi đã trải qua các kết nối DB từ xa sau một khoảng thời gian, nhưng tôi đã thấy (với Oracle) sử dụng RODBC và ROracle, và nó luôn là DB từ xa làm việc đó. – joran

Trả lời

0

Bạn có thể thêm truy tìm đến đoạn mã sau? Nếu vậy, sẽ hữu ích khi in ra các giá trị cho thisHandle, TYPEOF (ptr), thisHandle-> channel, thisHandle-> id để xem những gì đã thay đổi?

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)); 
} 
Các vấn đề liên quan