3.同時アクセスが多く、確実に更新処理を行いたいケース (銀行で自分の口座から他銀行の口座へ振込みを行うなど) 0019NAME IS NULL2009/02/15(日) 23:36:07ID:??? 3においてはUPDATEの内容よりも、Transaction を設定するみたいな話だな。 「ケースに分けてWHERE以下」というよりも、「ケースに分けてUPDATEの方法を」だったな。訂正 0020NAME IS NULL2009/02/20(金) 19:02:54ID:??? ADO.NETになっても結局SQL文を生成するスタイルはそんなに変わらないの? 0021NAME IS NULL2009/02/20(金) 19:40:24ID:??? 自動生成は使ったことないな SQL Server2008だけどManagementStudioでクエリ手書きで書いて パラメータ化してDataadapterかDatareaderにいれるケースが多い 伝票の登録とかもsqlcommandでパラメタ化した素のinsert文とか 排他制御はtimestamp使って楽観的ロックを自前で 複雑な処理はストアドにして結果をselectで返すようにして DatasetにFillして処理 Access使ってた時はGUIのクエリデザイナで書いてたけど 慣れたら手書きのほうがやりやすいな 0022NAME IS NULL2009/02/20(金) 20:06:49ID:??? ADO.NETは、SQLの自動生成機能を強化するかと思ってたが、そうでは無いみたい。 SQLは自分で書くスタイルを維持してて、それ以外の部分をウィザードやGUIで操作 出来るようにするモットーのようだ。(俺はウィザードやGUIはほとんど使わないけれどw) 今後は、SQLコードを書く際の支援(LINQ)をする方向に持っていくと見るといいのかな。 0023NAME IS NULL2009/02/20(金) 20:12:33ID:p5QGPAc4>>22 LINQ使ったことないけど、見ただけだと、O/Rマッパーっぽい感じがしてるんだけど #違うか 0024NAME IS NULL2009/02/20(金) 20:14:29ID:??? なるほど 自動生成スゲー!ADO.NETスゲー!って思って手を出してみたんですが、 なんとなく扱いづらい気がして結局手で書いてる自分がいて「コレでいいのか?」と疑問に。 なかなかうまくいかないなあ。
意外に人がいてびっくり。 0025NAME IS NULL2009/02/20(金) 20:18:12ID:???>>23 LINQのモットーはこれじゃないの? 今までは、操作するデータが異なると、その処理を行うコードもそれにあわせて 書く必要があった。(例えば、配列の全データにアクセスするコードと、 DBからテーブルを読み込んで全データにアクセスするコードは異なる。) そこが面倒なので、処理を行うコードを統一化しよう、という考え。 0026NAME IS NULL2009/02/20(金) 20:37:00ID:??? linq to sql はそこそこ便利だったぞw 0027NAME IS NULL2009/02/20(金) 21:50:55ID:???>>26 便利かもしれないが、しばらくの間は、規格が変わったりしそうに思う。 なので俺は ADO.NET を使うように考えてるな。 0028NAME IS NULL2009/02/20(金) 22:34:52ID:???>>26 ADO.NET と関係しそうなところを中心にレビューよろw 0029NAME IS NULL2009/02/21(土) 15:07:14ID:??? 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"));
using (OleDbDataAdapter da = new OleDbDataAdapter(selectcmd)) { DataSet ds = new DataSet(); da.Fill(ds); : :
田舎なので本屋にプログラミング関係の本がない・・・ 「プログラミングMicrosoft ADO.NET2.0」って良書ですか? 0030NAME IS NULL2009/02/21(土) 17:47:12ID:???>>29 Adapterと一緒にCommandもConnectionも生成して、 Adapterだけ解放すれば、Adapterと一緒に生成したObjectも解放される…のが理想なんだが 現実はそうならない。そのへんは色々問題があってなー
例) DataSet ds = new DataSet(); using (SqlDataAdapter adp = new SqlDataAdapter("SELECT * FROM hoge", new SqlConnection(ConnectionString))) { adp.Fill(ds); } これで済ませたいところなんだけど…このとき生成されたCommandやConnectionは解放されない。まさに仕様という名のバグw
このへんからいくつか辿ってみるとちょっと良いことあるかもしれない。 http://www.ailight.jp/blog/mnow/archive/2006/05/28.aspx0031NAME IS NULL2009/02/21(土) 23:16:30ID:???>>29 Connectionのusingだけで十分だ。 CommandやDataAdapterのインスタンスがDisposeされるまでに 時間がかかるが、そんなもん放っておけば良い。 重要なアンマネージリソースはConnectionにしかない。 003229です2009/02/21(土) 23:50:13ID:??? Dispose基準は重要なリソースか・・・目からウンコがおちたようだ。 せっかくのGCを無駄にするところだったかな。 URLありがとう、じっくり読んでみます。 0033NAME IS NULL2009/02/23(月) 03:34:32ID:kcpJjeEI accessのMDBファイルに、以下のように接続してSQLを発行してます。
using (OleDbConnection cn = new OleDbConnection(m_connectString)) { try { cn.Open(); OleDbCommand com = new System.Data.OleDb.OleDbCommand("SELECT name FROM Aテーブル ORDER BY sort;", cn); OleDbDataReader reader = com.ExecuteReader(); (データを取得する処理 省略) } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.Message); } finally { cn.Close(); } }
どうやったらレコードが1件もないときにExecuteReader()で例外を発生させないようにできるのでしょうか。 0034NAME IS NULL2009/02/23(月) 09:58:47ID:wqMGnrpl >>(データを取得する処理 省略) while で回してる? 0035NAME IS NULL2009/02/23(月) 20:30:44ID:??? hasrowでチェックするとかしたら? 0036NAME IS NULL2009/02/23(月) 21:18:04ID:??? クエリの中のどっかがプレースホルダとして認識されてんだろjk テーブル名と列名全部ブラケットで括ってみ。
//CurrentRecordが無いところでFieldを参照しようとした場合はInvalidOperationExceptionになる。 //OleDbExectionにはならん。 0037NAME IS NULL2009/02/23(月) 21:31:53ID:??? //同じコードで>>33試してみたが再現せんな… 0038NAME IS NULL2009/02/23(月) 22:10:44ID:??? >com.ExecuteReader()で catchで捕まえたからではなく、ステップ実行してそこで例外発生したって認識でOK? フィールド名のtypoだったらレコードの有無に関わらず発生しそうなものだけど・・・。 同じく試してみたけど再現しないですね。 0039NAME IS NULL2009/02/23(月) 22:20:28ID:??? if ( !com.Read() ) { // データないときの処理 } :
…なんてやってるわけないよね。 0040NAME IS NULL2009/02/24(火) 08:55:02ID:??? まさかとは思うが、レコードがないってのは テーブルは存在してるんだよな? 0041NAME IS NULL2009/02/24(火) 19:24:19ID:??? そこまで疑うのかよww 0042NAME IS NULL2009/02/25(水) 06:57:33ID:???>>33 どうやったらっていうか、普通レコードがなくても例外は発生しません
あと可能性としてはMDBが壊れてる可能性もあるな 一度ACCESSで修復かけてみては? 0043NAME IS NULL2009/02/25(水) 11:43:53ID:???>>33 ソース見るに finally は try ブロック内で実行されると思ってない? あくまで finally が実行されるタイミングはメソッド終了時。 using で宣言してるオブジェクトが解放されるタイミングもそう。
メソッドがこのソースで完結してるなら問題はでないと思うけど、 ほかにもいろいろ処理が含まれるなら思わぬ問題が出る可能性があるね。 using or try のネストはその辺理解して使わないと後でめんどいよ。
つーことでこのソースだけじゃ不具合原因はわからんと思う。 >>42 が言うように JET のエラーメッセージは当てにならんw 0044NAME IS NULL2009/02/25(水) 22:33:57ID:??? Dim DS As New DataSet Using db As New SqlConnection(db.ConnectionString) Using ocmd As SqlCommand = db.CreateCommand Using adp As New SqlDataAdapter(cmd)
これって? 0095[―{}@{}@{}-] NAME IS NULL2009/03/31(火) 12:17:50ID:???>>94 System.Transactionsでも使えばどうよ 0096NAME IS NULL2009/03/31(火) 18:03:26ID:???>>95 ありがとう。 System.Transactions見てみたけど、敷居高そうな希ガス。 0097NAME IS NULL2009/04/01(水) 01:39:46ID:??? sql server相手なら余裕 0098NAME IS NULL2009/04/01(水) 05:55:40ID:??? つか、DBを更新に行ってるなら、その間は接続してるだろう 接続型とか非接続型とか分けて考えるのがおかしくないか?
接続型、非接続型と、連結、非連結の区別がついてないんじゃないか? 0099NAME IS NULL2009/04/01(水) 10:43:14ID:???>>98 >接続型とか非接続型とか分けて考えるのがおかしくないか?
分けて考えるのは当然と思っていますが。 まったく動作が異なるので。 もちろんDB更新時には接続型・非接続型関係なく接続しないと更新できない訳で。。 それを承知で、1Transaction内で接続型・非接続型の両方を使うということについて 意見を聞いていたのですが。。 0100NAME IS NULL2009/04/01(水) 10:44:15ID:??? 連投すまん。