開発環境
▼開発環境
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(サーバー側カーソル)にしないと上手くできなかったと思います。
そこで
[vb]
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
[/vb]
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 を取得する
[vb]
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
[/vb]
ようやく思い出しました。そうでした。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
コメント