2016-07-27 33 views
1

私は、フォーム、マクロ、およびモジュールでMicrosoft Access 2016フロントエンドを使用してローカルでSQL Server 2012 Expressを使用するアプリケーションを持っています。多くの写真を含む検査データを収集するために現場で使用されています。ユーザーが3枚の以上の写真を添付し​​た場合MS Access 2013、SQL Server 2012 Express、クエリタイムアウト

Microsoft ODBC SQL Server Driver error: Query timeout expired

:問題は、メインリモートのSQL Server 2012に挿入するとき、私はエラーを取得するということです。

これまでリモートSQL Server(Properties \ Connections)でリモートクエリのタイムアウトを試してみましたが、サーバーの更新間隔を240秒(Tools \ Options)にしました。私は、AccessでSQL関数にVBAにコードを追加しました:

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

とアプリが起動したとき、私は走るAutoExecマクロに以下の機能を追加しました:最後に私

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 

:私は、各ストアドプロシージャを呼び出すための関数を作成した後

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 

:検査データと私はそれぞれ以下この形式の機能を作成した写真をアップロードするために必要な手順を追加するにはこれはすべて1つの手順に入れられている可能性がありますが、この段階では、リモートサーバーに挿入する問題があった場合、どこが故障したのかを知る必要がありました。これまでのところとても良いですが、私たちはまだ始まったばかりです。

+0

完了。それは州全体に広がったばかりなので、コードを最初に記載しませんでした。 – DLWyer

関連する問題