2016-07-27 2 views
1

양식, 매크로 및 모듈과 함께 Microsoft Access 2016 프론트 엔드를 사용하는 로컬에서 SQL Server 2012 Express를 사용하는 응용 프로그램이 있습니다. 현장에서 많은 사진을 포함하여 검사 데이터를 수집하는 데 사용됩니다. 문제는 주 원격 SQL Server 2012에 다음과 같은 오류가 발생합니다. 사용자가 3 장 이상의 사진을 첨부하면MS Access 2013, SQL Server 2012 Express, 쿼리 시간 초과

Microsoft ODBC SQL Server Driver error: Query timeout expired

입니다.

지금까지 원격 SQL Server (Properties \ Connections)에서 원격 쿼리 시간 초과를 시도했지만 서버 새로 고침 간격을 240 초 (Tools \ Options)로 늘 렸습니다. 나는 Access에서 SQL 기능의 VBA 코드를 추가했습니다 :

Dim Conn As ADODB.Connection 
Set Conn = New ADODB.Connection 
Conn.ConnectionTimeout = 120 

그리고 응용 프로그램이 시작될 때 나는 실행되는 자동 실행 매크로에 다음과 같은 기능을 추가했습니다 : 마지막으로 나는

Function SetTimeout() 
     Dim Mydb As Database 
     Set Mydb = CurrentDb 
     Mydb.QueryTimeout = 640 
    End Function 

VBA에서 연결 문자열의 끝에 "연결 시간 제한 = 90"추가 한 '

Server=localhost\SQLEXPRESS2012;Database=DamInspector; 

테스트 업데이트 스크립트 만 실행 67 초 정도 걸립니다하지만 "0"에서 시간의 다양한 길이를 시도했다 (무한대)에서 1024 그는 특정 런타임 오류 '-2147217871 (80040e31)'[Microsoft] [ODBC SQL Server 드라이버] 쿼리 제한 시간이 만료되었습니다
아마도 다른 방법은?
11 명의 검사원이 동기화해야하는 14 개의 테이블이 있습니다. 테이블 중 7 개는 사진입니다. 연결된 테이블을 통해 VBA를 스크립팅하는 대신 SQL Express의 각 로컬 인스턴스에서 저장 프로 시저를 실행하는 것이 더 좋을까요?

+0

다른 접근 방법이 필요하다고 생각합니다. ODBC 쿼리는 잠재적으로 불안정한 네트워크에서 (네트워크 속도와 관련하여) 많은 양의 데이터를 전송하는 데 실제로 적합하지 않습니다. 어떤 종류의 백그라운드 전송 (FTP?). – Andre

+0

사진 파일을 업로드하는 것이 아니라 BLOB 데이터를 테이블에 업로드하는 것입니다. – DLWyer

+0

예, 이해합니다. 문제는 IMHO입니다. 나는 데이터베이스에 사진을 전혀 저장하지 않거나 다른 채널을 통해 업로드 한 후에는 서버 프로세스로 사진을 삽입하는 등 매우 다른 접근 방식을 의미했습니다. – Andre

답변

1

나를위한 해결책은 SQL Server의 로컬 인스턴스에서 저장 프로 시저의 프로세스를 만들고 MS Access 폼에서 호출하는 것입니다. 또한 각 사용자의 PC에서 프로 시저를 생성하는 작은 함수를 만들었으므로 수동으로 그렇게 할 필요가 없었습니다. 주 전역에서 사용자에게 배포해야하므로 Access에서 작업이 수행됩니다.

Function Call_ProcAppendToGeneralPics() 
Screen.MousePointer = 11 
    Dim Conn As ADODB.Connection 
     Set Conn = New ADODB.Connection 
     Conn.Open ("Driver={SQL Server};Server=localhost\SQLEXPRESS2012;Database=DamInspector") 

     Conn.Execute "AppendToAncillaryPics" 
     Conn.Execute "AppendToAuxSpillwayPics" 
     Conn.Execute "AppendToCrestPics" 
     Conn.Execute "AppendToDownstreamPics" 
     Conn.Execute "AppendToGeneralPics" 
     Conn.Execute "AppendToOcPics" 
     Conn.Execute "AppendToRiserPics" 
     Conn.Execute "AppendToUpstreamPics" 

    Conn.Close 
    Screen.MousePointer = 0 
'Notify the user the process is complete. 
    MsgBox "Upload Process Completed." 
End Function 

: I는 각 저장 프로 시저를 호출하는 기능을 만든 다음

Function CreateProcAppendToAncillaryPics() 
    'Change mouse to hour glass so end user knows something is going on 
    Screen.MousePointer = 11 

    Dim Conn As ADODB.Connection 
     Set Conn = New ADODB.Connection 
     Dim strCreateProcAncillaryImages As String 
     Conn.Open ("Driver={SQL Server};Server=localhost\SQLEXPRESS2012;Database=DamInspector") 

     strCreateProcAncillaryImages = "CREATE PROCEDURE dbo.AppendToAncillaryPics AS " & _ 
    "INSERT INTO [xxx.xxx.xxx.xxx].DamInspector.dbo.AncillaryImages " & _ 
       "(tableVersion, ID, techUName, DamsPhoto, PhotoDescription, structName, marker, thisdate, uuid)" & _ 
       " SELECT " & _ 
        "L.tableVersion, L.ID, L.techUName, L.DamsPhoto, L.PhotoDescription, L.structName, L.marker, L.thisdate, L.uuid" & _ 
       " FROM DamInspector.dbo.AncillaryImages AS L" & _ 
        " LEFT OUTER JOIN " & _ 
        "[xxx.xxx.xxx.xxx].DamInspector.dbo.AncillaryImages AS R " & _ 
        "ON L.uuid = R.uuid " & _ 
       "WHERE " & _ 
        "R.uuid IS NULL;" 

    Conn.Execute strCreateProcAncillaryImages 
    Conn.Close 
    'Set the mouse pointer back to normal 
    Screen.MousePointer = 0 
'Notify the user the process is complete. 
    MsgBox "Upload Process Completed." 
End Function 

: 검사 데이터와 I는 각각 다음은이 형식의 기능을 만들어 사진을 업로드하는 데 필요한 절차를 추가하려면 이 모든 것이 하나의 절차에 포함될 수도 있지만이 단계에서는 원격 서버에 삽입하는 데 문제가있는 경우 어디에 중단했는지 알 필요가있었습니다. 지금까지는 그렇게 좋았지 만 우린 겨우 시작했습니다.

+0

완료. 주 전역에 걸쳐 방금 출시되었으므로 처음에는 코드를 나열하지 않았습니다. – DLWyer