- PR -

DBへの排他制御の方法について

投稿者投稿内容
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-05-24 17:37
> つまり、WHERE句に条件を書いてUPDATE文を走らせた後
> SELECT句で更新を確認する。。ということでしょうか?

違います。
まず、ユーザに表示するためにデータを取り出してきたときに、そのデータの
更新日時も一緒に取り出してきます。
ユーザが修正等を行って、データを更新しようとするとき、Where句内に
最初に取り出してきた更新日時と現在の更新日時が同じかどうかの判定を
いれます。
こうしておくと、データを取り出してきたときと更新日時が変わっていたら
データは更新されません。
更新時に変更のあったデータの数はたいてい取り出せるはずなので、
これが0件(更新されていない)だったら別のユーザによってデータが
変更されていた、と考えられ、そこでエラーメッセージをだすなり
なんなりします。

#というのが甕星さんが書いているSQL文の意味です。

ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-05-24 17:39
引用:

なせさんの書き込み (2006-05-24 17:18) より:
ちなみに
ぶさいくろうさん
デバッグモードで値を確認してみても、
a(0) | "1" string
b | "1" string
とかだったのですが。。
どうしろと?


そいつぁすごいな。ありえねぇ。
クリーンビルドしましたか?以前の問題だわ。
VS落としても再現するんだったらブツをどっかにあげてMSに訴えりゃよかったのに。
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-05-24 17:41
引用:

" = " で比較するとうまく判断できないのですが、
" equals " で判断させると思ったとおりの処理をする。。


たぶん、Option Compare Binary/Textの設定による違いでしょう。
VBの場合、等値演算子(=)はOption Compare ステートメントの影響を受けますが、
Equalsメソッドは影響を受けません。これは仕様です。
また、C#の場合はOption Compare ステートメント自体がないので
等値演算子(==)とEqualsメソッドは常に同じ結果を返します。

値に英字が含まれていませんでしたか?
なせ
常連さん
会議室デビュー日: 2006/01/06
投稿数: 41
お住まい・勤務地: おおさか
投稿日時: 2006-05-24 17:59
引用:

どっとねっとふぁんさんの書き込み (2006-05-24 17:37) より:
更新時に変更のあったデータの数はたいてい取り出せるはずなので、
これが0件(更新されていない)だったら別のユーザによってデータが
変更されていた、と考えられ、そこでエラーメッセージをだすなり
なんなりします。


更新した行数って取り出せたんですね。。。
知ってたら、よほど楽に書けていたでしょうに。。。
ありがとうございます。
勉強になりました(^^

引用:

うにくまさんの書き込みより

たぶん、Option Compare Binary/Textの設定による違いでしょう。
VBの場合、等値演算子(=)はOption Compare ステートメントの影響を受けますが、
Equalsメソッドは影響を受けません。これは仕様です。
また、C#の場合はOption Compare ステートメント自体がないので
等値演算子(==)とEqualsメソッドは常に同じ結果を返します。

値に英字が含まれていませんでしたか?


C#で開発していました。
(最近VBでしか開発しいないもので書き方がVBになっているかもですが。。)
(==)とEqualsメソッドは必ずしも同じ結果では無いと記憶しています。。

C# では文字列の比較に Equals を使うな

↑少し内容に違和感は感じますが

ちなみに値に英字が含まれていませんでしたか?というのはどういう意味なのでしょう?
# 質問ばかりでごめんなさい。。。


[ メッセージ編集済み 編集者: なせ 編集日時 2006-05-24 18:00 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-05-24 18:08
引用:

(==)とEqualsメソッドは必ずしも同じ結果では無いと記憶しています。。


そうですよ。同じ結果にしたければ、等値演算子をオーバーロードして、Equals() と同じ働きをするしなければなりません。
そして、String はそうなっています。
文字列の "1" と数値の 1 を比較した、なんてオチではないですよね?

なせさんが仰る結果になるコードを完動する形で欲しいですね。
_________________
囚人のジレンマな日々
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-05-24 18:10
引用:

囚人さんの書き込み (2006-05-24 18:08) より:
文字列の "1" と数値の 1 を比較した、なんてオチではないですよね?


C#だったらコンパイル通らなくね?
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-05-24 18:21
引用:

C#だったらコンパイル通らなくね?


演算子の方ならね。
その辺の記憶が曖昧になって「== と Equals が違う!」と言ってるのかな、と。
_________________
囚人のジレンマな日々
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-05-24 18:24
引用:

(==)とEqualsメソッドは必ずしも同じ結果では無いと記憶しています。。


いえ、同じはずです。等値演算子(=={op_Equality})の実装はEqualsメソッドを使用しています。


引用:

ちなみに値に英字が含まれていませんでしたか?というのはどういう意味なのでしょう?


(VBでは)Option Compare Textの場合、大文字と小文字が区別されないので、
期待する結果を得られなかったのでは?と思ったのですが、違うようですね。

スキルアップ/キャリアアップ(JOB@IT)