開発環境
▼開発環境
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
コメント