Access+ADOで更新件数取得

開発環境

▼開発環境
windows8.1 + office365(32bit) + MySQL

ADOにてUPDATEした件数を取得したい

AccessからMySQLへODBC接続してADOにてUPDATEしてUPDATE件数が上手く取れなくて苦戦しました。
あれ・・どうやるんだっけ?と思いながら模索していました。
普通に取れたように思うんだけど、あんまり件数を気にする事はなかったかも・・みたいな。

Dim strSql As String
Dim recCnt As Long

strSql = “UPDATE~”
objCmd.CommandText = strSql
‘SQL実行
objCmd.Execute recCnt

で、
If recCnt <> 0 Then ★←ここ

Else
‘ insert
End If

これで出来るという記事もありやってみたけど、何度試みても上手くできませんでした。
recCnt をLong型にすればOKともあったのでLongにしたけどダメでした。
ループの1回目は1で戻ってくるけど2回目以降は-1になっていました。
この件数が0の時はinsertとしたかったのです。

原因はCursorLocationか?

ADOはCursorLocationがあるのでそれが要因かなと思いました。
デフォルトadUseServer(サーバー側カーソル)なので。
だけど、更新処理はadUseServer(サーバー側カーソル)にしないと上手くできなかったと思います。

そこで

Dim objRsAdo As New ADODB.Recordset

   strSql = "UPDATE~"
   objCmd.CommandText = strSql
   'SQL実行update
   objCmd.Execute recCnt

    '------------------------------
    ' データが存在するかチェック
    '------------------------------
    objRsAdo.CursorLocation = adUseClient
    objRsAdo.CursorType = adOpenDynamic
    
    strSql = "SELECT * FROM d_order WHERE ~"
    objRsAdo.Open strSql, gobjCon

    If objRsAdo.RecordCount = 0 Then
        recCnt = 0
    Else
        recCnt = objRsAdo.RecordCount
    End If
    ' 後処理
    objRsAdo.Close: Set objRsAdo = Nothing

objRsAdo.CursorLocation = adUseClient

objRsAdoのカーソルタイプをadUseClient(クライアント側カーソル)にして取得しました。

つまり、AccessでSELECTするものはクライアント側カーソルにする必要があります。
INSERTする場合はサーバー側カーソルです。

CursorLocationプロパティにadUseClient(クライアント側カーソル)を設定すると
ADOは、Cursor Serviceを起動し、取得したデータをクライアント側に持ちます。
そして、そのデータによってRecordCountプロパティにレコード数が設定されます。
一方、CursorLocationプロパティにadUseServer(サーバー側カーソル)を設定すると
ADOは、Cursor Serviceを起動せず、したがって、クライアント側にデータありません。
よって、RecordCountプロパティにレコード数が設定されません。
尚、CursorLocationプロパティのデフォルト値もadUseServerです。

ADO接続でSELECTしてRecordCount を取得する

Dim objCon As New ADODB.Connection
Dim objRs  As New ADODB.Recordset
Dim objRSUnit  As New ADODB.Recordset

    ' データベースを開く
    objCon.ConnectionString = conConnectStr
    objCon.Open

    ' カーソル設定
    objRs.CursorLocation = adUseClient
    strSql = "SELECT ~"
    objRs.Open strSql, objCon, adOpenDynamic, adLockPessimistic

    If objRs.RecordCount > 0 Then

ようやく思い出しました。そうでした。ADOはカーソルがあったのでした。

まとめ

最近は、SELECTはDAOで更新系のみADOを使うというのも多かったなと思います。
その方が楽なので・・全部ADOは結構面倒です。
Selectする際にID系などはキャストしないと上手く取れないというのもありました。

今回はupdate or insert したかっただけなのですが
そもそも普通に最初にselectしてinsert or updateと振り分けても良いと思うのです。
今までだったら最初にselectして件数0だったらinsertしてそれ以外はupdateと
していただろうなと思います。

JAVAの共同開発でupdateして件数0だったらinsertするという手法をここ最近使っていたので
その癖が出てしまいました。
この手法は、排他絡みでメンバーが考案したものですが、慣れるまで使いにくくて
でも気が付いたら馴染んでいたのかも・・と思います。

気持ち悪いのでSELECTしてから更新に修正しようかな~

参考
http://replication.hatenablog.com/entry/20090312/1236866953
http://chaichan.lolipop.jp/vbtips/VBMemo2007-07-26.htm

コメント

タイトルとURLをコピーしました