ちょっと引っかかったので、
メモ代わりに投稿
recordsAffectedの復帰値がゼロになる。
accessVBAにて、
SQL実行をチェックする方法として、
recordsAffectedを使う事がある。
この復帰値が更新したい行数と一致すればOK、というチェックを使う。
(わたしは結構使う)
この復帰値がいつもゼロになっている。
おかしいと思ってupdate結果やinsert結果を見るが、
きちんとupdateやinsertは成功している。
それでも、recordsAffectedはゼロ
cnt = Database.RecordsAffected
print cnt
結果
0
何でだろ?
ゼロになる理由
さっさと理由を
数値型項目にNULLを入れる「入れ方」が間違えている。
数値型項目にNULLを入れる場合、’’でもNULLとして入れられる。
ただし、これだと、SQL文的に間違えていると判断している(のだろう)
そのためにrecordsAffectedの復帰値はゼロとなっている(と推定される)
でも、
優秀なDAOは’’をNULLとして認識し、
きちんとinsert/updateを実行してくれる。
実行例
Database.execute("update kazu = '' ,mozi='hoge' from hoge where id=1 ")
cnt = Database.RecordsAffected
print cnt
Database.execute("update kazu = NULL ,mozi='geho' from hoge where id=1 ")
cnt = Database.RecordsAffected
print cnt
結果
0
1
両方ともmoziはhoge/gehoになっている。
これが発生すると、
「データは更新しているのに、『更新失敗』エラーが出る」
みたいなことになる。
ハマると、なかなか見つけられない可能性も・・・
ハマらないために
対策は
- 数値型項目はNULLを許可しない
- SQL文で数値型に対し、’’を使わない。
設計段階でNULを不許可にすれば、起こらないので
こっちの方が気が楽かもしれない
プログラム開発段階では、
ついつい便利な''を使ってしまいがち、
(SQL文をプログラムで生成するときに、ついつい・・)
ちょっと注意が必要かと