完全に自分の備忘録です。
ココがポイント
AccessからSqlServerにODBCで接続してリンクテーブルから更新するとタイムアウトするくらい遅延状態からの実験になります。
結論は、これと言った解決策が見つかりませんでした。
段々と更新が遅延
データを更新するVBAは、下記のようになります。
Private Sub regist_only_btn_Click()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
If MsgBox("登録しますか? yes/no", vbYesNo, "データ登録") = vbYes Then
On Error GoTo ErrRtn
'アクションクエリ非表示設定
DoCmd.SetWarnings False
Set cn = CurrentProject.Connection
rs.CursorLocation = adUseClient
rs.Open "orderdata", cn, adOpenKeyset, adLockOptimistic
rs.Filter = "NO = " & edit_value
' トランザクションの開始
cn.BeginTrans
rs!date_no = Me!date_no_input
rs!approved = Me!approved_input
rs!bp_no = Me!bp_no_input
rs!inquiry_no = Me!inquiry_no_input
rs!office_remarks = Me!office_remarks_input
rs.Update
' トランザクションの保存
cn.CommitTrans
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
MsgBox ("登録しました。")
Else
MsgBox ("登録しないで戻りました。")
Exit Sub
End If
ExitErrRtn:
Exit Sub
ErrRtn:
MsgBox "エラー: " & Err.Description
cn.RollbackTrans
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End SubSqlServerからリンクテーブルしている「orderdata」をレコードセットで開いて、「NO」でフィルターしてから更新するVBAですが、レコード数が増えると、異常に接続が遅くなり、2万レコードを超えるころには、ODBC接続エラーになってしまいました。
ストアドで更新するのがベストなのだが・・・
Sqlserverを使うなら、ストアドを使用するのがベストだと思うのですが、自分の実力では、どうも挙動がおかしい。更に、デバッグの方法がよくわかってないので手に負えない。
そこで、直接SqlServerに接続して、テーブルをレコードセットにしたら何とかなるんじゃないかと実験して見る事にしました。
SqlServerのテーブルをレコードセット
下記のようにVBAを変えました。
Private Sub regist_only_btn_Click()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strSQL As String
If MsgBox("登録しますか? yes/no", vbYesNo, "データ登録") = vbYes Then
'データベースに接続します。
Set cn = New ADODB.Connection
ConString = "Driver={SQL Server};SERVER=192.168.0.×××\SQLEXPRESS;UID=User;PWD=Password;DATABASE=DB_NANE"
cn.Open ConString
On Error GoTo ErrRtn
'アクションクエリ非表示設定
DoCmd.SetWarnings False
' strSQL = "SELECT * FROM orderdata WHERE NO = " & edit_value ※これダメ
strSQL = "SELECT * FROM [dbo].[order] WHERE [dbo].[order].[NO] = " & edit_value
rs.CursorLocation = adUseClient
rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic
' トランザクションの開始
cn.BeginTrans
If rs.EOF Then
MsgBox "データありません"
Else
rs!date_no = Me!date_no_input
rs!approved = Me!approved_input
rs!bp_no = Me!bp_no_input
rs!inquiry_no = Me!inquiry_no_input
rs!office_remarks = Me!office_remarks_input
rs.Update
End If
' トランザクションの保存
cn.CommitTrans
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
Else
MsgBox ("登録しないで戻りました。")
Exit Sub
End If
ExitErrRtn:
Exit Sub
ErrRtn:
MsgBox "エラー: " & Err.description
cn.RollbackTrans
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub「cn」でSqlServerに接続して、「rs.open」にて、strSQLをレコードセットで開きました。
ココがダメ
ここで、SQLがなかなか値を抽出してくれませんでした!
丸1日いろいろやって記述がダメだったことがわかりました。
strSQL = "SELECT * FROM [dbo].[order] WHERE [dbo].[order].[NO] = " & edit_value
この[dbo].[テーブル名]のカッコが重要でした。
オブジェクトがどうの?とか、演算子が見つからない?とか訳の分からないエラーが出たり、出なくても期待した更新ができない状態が続きました。結局は、このカッコが重要だったようです。
知らないよー
結局は原因不明だけど・・・
VBAを色々と修正して実験を繰り返しやって見ましたが、更新遅延は改善しませんでした。
Sqlserverをクラウドに置きVPNで接続しているので、どこかでボトルネックを起こしているという事も考えらるのですが、普通にテーブルデータを見るだけなら接続遅延を感じません。
では、SqlServerが無料ライセンスのExpressだから?なのかも怪しい部分でもあります。
有償ライセンスを導入してまでやるような内容じゃないし・・・モヤモヤします。
※Developer版で後ほど試して見たいと思います。
接続遅延解消
結局、レコード数を3000件程度にすれば、問題が解消することが分かりました。
でも、3000件じゃ、データベースの役割を果たしているとは言えません。
最後までモヤモヤするSqlServerとACCESSとの組み合わせです。
