LoginSignup
1
1

More than 5 years have passed since last update.

recordsAffectedの奇怪な動き

Posted at

ちょっと引っかかったので、
メモ代わりに投稿

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文をプログラムで生成するときに、ついつい・・)
ちょっと注意が必要かと

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1