ADO.NETの質問・雑談スレ2 (421レス)
1-

10
(1): 2009/02/13(金)11:10 ID:??? AAS
俺の場合、UPDATEはシビアに同時実行制御をする必要がないため、
(比較的規模の小さな、数人使用のシステムの場合が多い為)
WHEREは主キーを指定するのみで、強制上書き方式でやってる。

強制上書きというのは、「読み込み時」と「データ更新直前」の
データが同じであるかをチェックせずに、主キーを指定して
UPDATEを実行という意味合い。
すでに誰かがレコードを削除していて・・・という場合はエラーが
出るが、そのあたりの処理は書く必要もないかなと思う感じ。

「設計は場合による」といってしまえばそうだが、個人レベルの
開発だとこういうのが大多数じゃないかなと思うけど、どうかな。
11: 2009/02/13(金)13:04 ID:??? AAS
TIMESTAMPも使うけど、数人〜の小規模で
業務内容的に被らない想定のときは
更新日時の列作って使いまわしてしまう。

同じ業務の人が何人も居て被るかもーとなったらTIMESTAMP、
衝突上等となったら…行ロックするか、一次的な編集禁止フラグでも立てるか。
12
(1): 2009/02/13(金)20:14 ID:EjaPaESH(2/2) AAS
>>10
消えてもいいデータがあるってのならいいけど
timestamp列をつくって主キーと一緒にチェックするだけで
楽観ロックできるんだからやったほうがいいと思うけどなぁ。
13
(1): [age] 2009/02/13(金)23:59 ID:??? AAS
>>12
データを更新する際、主キーは同じだけどtimestampが異なってるという時の
処理は具体的にどうするのって思ってしまうんだよね。
ユーザに(「このデータは誰かが更新中です。上書きしますか?」みたいな)
ダイアログを表示させても、ユーザは結局はそのダイアログだけでは上書きしても
良いかどうかの判断は出来ないしね。
適当に「はい」を押してしまえってなって、その機能を実装した意味が実質
なかったりするって体験があったんだけど、どうよ?

これは、たまたま俺が悪いユーザにあたっただけかな?
14: [age] 2009/02/14(土)00:08 ID:??? AAS
どういうアプリであるかによって、処理内容がという場合もあると思うので、
具体例を一応書いておきます。

名簿の管理ソフト
すでに登録しているAさんのデータを修正し、「更新」ボタンを押した。
その時、「すでに他の人が・・・」というメッセージが表示された。
その時点では、他の人が修正したデータの内容は確認出来ない。
また、念のためと思って更新しないで、データを確認してみると、
間違ったデータであり、自分は再度同じデータを入力する羽目に
なってしまった。ああ、面倒だ・・・みたいな。
15: 2009/02/14(土)00:54 ID:??? AAS
基本はエラーメッセージを出して入力し直しだろうな
間違ったデータを入れるとかかなりレアなケースだろうし、
99%くらいは、あ、オレの代わりに誰か入れといてくれたか
くらいですむんじゃね?
こんなん絶対ゆるさーん、とかいうユーザは
しょうがないからフラグでもたててロックかけるしかないんじゃね?
16: 2009/02/14(土)19:41 ID:??? AAS
基本は読み直して再入力でしょう
楽観的ロックすらしないでおくと
先に編集したのが無効になっちゃうわけだから

オフコン使ってた時はそんなの関係ねーでやってたみたいだけどね
富士通cobolだったかな

あとはロックとかフラグたてるけどあとから来たほうが所有権
ぶんどれるような仕掛けにするとか
17: 2009/02/15(日)12:22 ID:??? AAS
>>13
既に書かれてるけど、結論はケースバイケース。

・エラーメッセージを出して更新処理を中断し、再度データ確認後に必要なら再入力。
・そんなの関係ねぇで、更新する。

俺がいつもやるのは下記の通り。

主キーとタイムスタンプでチェックし、タイムスタンプが異なっていた場合、
・エラーメッセージを表示
・更新画面でユーザが入力した値は残しつつ、現在のデータを並列表示させる。
 (別画面とか入力項目の上とか画面上または下とか場合によって表示場所は事なるが・・・)
・ユーザは現在の内容を確認し、変更の必要がなければ処理を中止
省1
18: [age] 2009/02/15(日)17:16 ID:??? AAS
ケースごとに分けてWHERE以下などをどう書いていったらよいのかをまとめるといいかもね。
ケースバイケースという結論になるのも分かるけれど、どういう処理をした方が良いかは
ADO.NETは提供しない(当然だが)のだから、そのあたりのノウハウをまとめるのは必要だと思う。

0.スタンドアロン
・UPDATE時は主キーのみでおk
・将来の拡張を考えるならば、1を参考にコーディングしておくと良い。

1.小規模、同時アクセスが少ないケース
・UPDATE時のWHERE 以下は主キーとタイムスタンプで確認
・ダイアログを出して判断を促すなど。

2.同時アクセスが多く、先にデータを表示させた方が更新できるようにするケース
省3
19: [age] 2009/02/15(日)23:36 ID:??? AAS
3においてはUPDATEの内容よりも、Transaction を設定するみたいな話だな。
「ケースに分けてWHERE以下」というよりも、「ケースに分けてUPDATEの方法を」だったな。訂正
20: 2009/02/20(金)19:02 ID:??? AAS
ADO.NETになっても結局SQL文を生成するスタイルはそんなに変わらないの?
21: 2009/02/20(金)19:40 ID:??? AAS
自動生成は使ったことないな
SQL Server2008だけどManagementStudioでクエリ手書きで書いて
パラメータ化してDataadapterかDatareaderにいれるケースが多い
伝票の登録とかもsqlcommandでパラメタ化した素のinsert文とか
排他制御はtimestamp使って楽観的ロックを自前で
複雑な処理はストアドにして結果をselectで返すようにして
DatasetにFillして処理
Access使ってた時はGUIのクエリデザイナで書いてたけど
慣れたら手書きのほうがやりやすいな
22
(1): [age] 2009/02/20(金)20:06 ID:??? AAS
ADO.NETは、SQLの自動生成機能を強化するかと思ってたが、そうでは無いみたい。
SQLは自分で書くスタイルを維持してて、それ以外の部分をウィザードやGUIで操作
出来るようにするモットーのようだ。(俺はウィザードやGUIはほとんど使わないけれどw)
今後は、SQLコードを書く際の支援(LINQ)をする方向に持っていくと見るといいのかな。
23
(1): 2009/02/20(金)20:12 ID:p5QGPAc4(1) AAS
>>22
LINQ使ったことないけど、見ただけだと、O/Rマッパーっぽい感じがしてるんだけど
#違うか
24: 2009/02/20(金)20:14 ID:??? AAS
なるほど
自動生成スゲー!ADO.NETスゲー!って思って手を出してみたんですが、
なんとなく扱いづらい気がして結局手で書いてる自分がいて「コレでいいのか?」と疑問に。
なかなかうまくいかないなあ。

意外に人がいてびっくり。
25: [age] 2009/02/20(金)20:18 ID:??? AAS
>>23
LINQのモットーはこれじゃないの?
今までは、操作するデータが異なると、その処理を行うコードもそれにあわせて
書く必要があった。(例えば、配列の全データにアクセスするコードと、
DBからテーブルを読み込んで全データにアクセスするコードは異なる。)
そこが面倒なので、処理を行うコードを統一化しよう、という考え。
26
(2): 2009/02/20(金)20:37 ID:??? AAS
linq to sql はそこそこ便利だったぞw
27: [age] 2009/02/20(金)21:50 ID:??? AAS
>>26
便利かもしれないが、しばらくの間は、規格が変わったりしそうに思う。
なので俺は ADO.NET を使うように考えてるな。
28: [age] 2009/02/20(金)22:34 ID:??? AAS
>>26
ADO.NET と関係しそうなところを中心にレビューよろw
29
(3): 2009/02/21(土)15:07 ID:??? AAS
C#2008(.NET3.5)+Access(mdb)でADO.NETを勉強し始めたんだけど、usingのネストになってしまった。
ADOやらoo4oやらは弄ったことあるんだけどこれは・・・考え方がそもそも間違ってる?

//testtableから指定testidのレコードを持ってくる
using (OleDbConnection cnn = new OleDbConnection(connectionstring))
{
  string selectsql = "select * from testtable where testid = @testid ";
  
  using (OleDbCommand selectcmd = new OleDbCommand(selectsql, cnn))
  {
    selectcmd.Parameters.Add(new OleDbParameter("@testid", "1"));
省8
1-
あと 392 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.006s