[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/07/06(Fri) 06:52
投稿者名:やまちゃん
Eメール:
URL :
タイトル:
OSのキャッシュについて
お世話になります。

非常に素人です。
環境はVB6(SP3)です。

MDBにADO接続して読み書きするときに下記のようなサブルーチンを使用していますが、
Dim Cmd …から数えて、上から7行目の Cnn.Properties(……)=1 のところで「1」は
「OSのキャッシュをバイパスする」と認識しておりますが、この場合、

@何か特別な方法でOSのキャッシュをクリアする方法があるのでしょうか?
ACnn.Close、Set Cnn = NothingでOSのキャッシュもクリアされるのでしょうか?

少々長くなりますがコードを書きます。
(Microsoft ActiveX Data Objects 2.8 Libraryを参照)
(Microsoft ADO Ext.2.8 for DDL and Securityを参照)
(Microsoft Jet and Replication Objects 2.6 Libraryを参照)

※Call sSQL_EXECUTE("INSERT INTO 〜",myConnection)のような感じで使用してます。

----------------------------------------------------------------------------
コードの部分をもう一度(どうして修正できないんだろう?)

----------------------------------------------------------------------------
Option Explicit
Public Const MAX_RETRIES = 10
Public Jet_Engine As New JRO.JetEngine
----------------------------------------------------------------------------
Public Sub sSQL_EXECUTE(ByRef mySQL As String, ByRef Cnn As ADODB.Connection)
  Dim Cmd      As ADODB.Command
  Dim Cat           As New ADOX.Catalog
  Dim ErrorCount    As Long
  Dim InTransaction As Boolean
  Dim OldCommitMode As Long
  
  OldCommitMode = Cnn.Properties("Jet OLEDB:Transaction Commit Mode")
  Cnn.Properties("Jet OLEDB:Transaction Commit Mode") = 1 ←ここ
  
  Set Cat = New ADOX.Catalog
  Cat.ActiveConnection = Cnn
  
  Set Cmd = New ADODB.Command
  Cmd.ActiveConnection = Cnn
  Cmd.CommandText = mySQL
  
  On Error GoTo SQL_EXE_Error
  
  Cnn.BeginTrans
  InTransaction = True
  
  Jet_Engine.RefreshCache Cnn
  Cmd.Execute '実行
  
  InTransaction = False
  Cnn.CommitTrans
  
  '--- 終了 ---
  Set Cmd = Nothing
  Set Cat = Nothing
  Cnn.Properties("Jet OLEDB:Transaction Commit Mode") = OldCommitMode
  Exit Sub
  
SQL_EXE_Abort:
  On Error Resume Next
  If InTransaction Then
    Set Cmd = Nothing
    Set Cat = Nothing
  End If
  Err.Clear
  Cnn.Properties("Jet OLEDB:Transaction Commit Mode") = OldCommitMode
  Exit Sub
  
SQL_EXE_Error:
  ErrorCount = ErrorCount + 1
  If ErrorCount < MAX_RETRIES And InTransaction Then
    Cnn.RollbackTrans
  Else
    Resume SQL_EXE_Abort
  End If
  
End Sub


よろしくお願いいたします。
コードが長くてごめんなさい(抜き出しの方がよかったかな?)。

投稿時間:2007/07/06(Fri) 14:05
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: OSのキャッシュについて
> Cnn.Properties("Jet OLEDB:Transaction Commit Mode") = 1 ←ここ
一応それで動作しますが、できれば
 Cnn.Properties(…).Value = 〜
の構文を使うべきかと。

> (1)何か特別な方法でOSのキャッシュをクリアする方法があるのでしょうか?
ライトキャッシュの内容がクリアされてしまってまずいのでは?(書き込みが失敗してしまう)
それに、そもそも最初からキャッシュさせないモードで書き込みを行っているならば、
キャッシュをクリアさせる必要もありませんよね。

> (2)Cnn.Close、Set Cnn = NothingでOSのキャッシュもクリアされるのでしょうか?
独立しています。OS キャッシュの動作とは無関係です。

> Public Sub sSQL_EXECUTE(ByRef mySQL As String, ByRef Cnn As ADODB.Connection)
今回の場合、どちらも ByVal で十分でしょう。

また、ADO オブジェクトの ByRef 渡しは避けた方が無難です。
下記のような問題も報告されていますし。
http://support.microsoft.com/kb/264701/ja

>   Dim Cat           As New ADOX.Catalog
宣言時に New をつける構文は、あまりお奨めできません。

投稿時間:2007/07/06(Fri) 14:36
投稿者名:やまちゃん
Eメール:
URL :
タイトル:
Re^2: OSのキャッシュについて
> > Cnn.Properties("Jet OLEDB:Transaction Commit Mode") = 1 ←ここ
> 一応それで動作しますが、できれば
>  Cnn.Properties(…).Value = 〜
> の構文を使うべきかと。

確かに…。

> ライトキャッシュの内容がクリアされてしまってまずいのでは?

これも、確かに…。

> それに、そもそも最初からキャッシュさせないモードで書き込みを行っているならば、
> キャッシュをクリアさせる必要もありませんよね。

私の思い違いのようでした。もう一度、確認して頭の中を整理します。

> > (2)Cnn.Close、Set Cnn = NothingでOSのキャッシュもクリアされるのでしょうか?
> 独立しています。OS キャッシュの動作とは無関係です。

これがずっと気になって調べてました。貴重な情報、ありがとうございます。

> 宣言時に New をつける構文は、あまりお奨めできません。

私の持っている教科書(テクニック集)にこのような感じの書き方をしていたので、
あまり考えずに使ってました。よく調べてみます。

素人の投稿に、お手数お掛けしました。
ありがとうございます。