ADO.NETの質問・雑談スレ2 (421レス)
ADO.NETの質問・雑談スレ2 http://mevius.5ch.net/test/read.cgi/db/1234077152/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
31: NAME IS NULL [sage] 2009/02/21(土) 23:16:30 ID:??? >>29 Connectionのusingだけで十分だ。 CommandやDataAdapterのインスタンスがDisposeされるまでに 時間がかかるが、そんなもん放っておけば良い。 重要なアンマネージリソースはConnectionにしかない。 http://mevius.5ch.net/test/read.cgi/db/1234077152/31
32: 29です [sage] 2009/02/21(土) 23:50:13 ID:??? Dispose基準は重要なリソースか・・・目からウンコがおちたようだ。 せっかくのGCを無駄にするところだったかな。 URLありがとう、じっくり読んでみます。 http://mevius.5ch.net/test/read.cgi/db/1234077152/32
33: NAME IS NULL [] 2009/02/23(月) 03:34:32 ID: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(); } } このとき、SQLの対象のAテーブルにレコードがあれば問題なく動くんですが、 Aテーブルにレコードが1件もないとき、com.ExecuteReader()で例外が発生します。 例外の内容は Message="1 つ以上の必要なパラメータの値が設定されていません。" Source="Microsoft JET Database Engine" ErrorCode=-2147217904 StackTraceはExecuteReader()の行です。 どうやったらレコードが1件もないときにExecuteReader()で例外を発生させないようにできるのでしょうか。 http://mevius.5ch.net/test/read.cgi/db/1234077152/33
34: NAME IS NULL [] 2009/02/23(月) 09:58:47 ID:wqMGnrpl >>(データを取得する処理 省略) while で回してる? http://mevius.5ch.net/test/read.cgi/db/1234077152/34
35: NAME IS NULL [sage] 2009/02/23(月) 20:30:44 ID:??? hasrowでチェックするとかしたら? http://mevius.5ch.net/test/read.cgi/db/1234077152/35
36: NAME IS NULL [sage] 2009/02/23(月) 21:18:04 ID:??? クエリの中のどっかがプレースホルダとして認識されてんだろjk テーブル名と列名全部ブラケットで括ってみ。 //CurrentRecordが無いところでFieldを参照しようとした場合はInvalidOperationExceptionになる。 //OleDbExectionにはならん。 http://mevius.5ch.net/test/read.cgi/db/1234077152/36
37: NAME IS NULL [sage] 2009/02/23(月) 21:31:53 ID:??? //同じコードで>>33試してみたが再現せんな… http://mevius.5ch.net/test/read.cgi/db/1234077152/37
38: NAME IS NULL [sage] 2009/02/23(月) 22:10:44 ID:??? >com.ExecuteReader()で catchで捕まえたからではなく、ステップ実行してそこで例外発生したって認識でOK? フィールド名のtypoだったらレコードの有無に関わらず発生しそうなものだけど・・・。 同じく試してみたけど再現しないですね。 http://mevius.5ch.net/test/read.cgi/db/1234077152/38
39: NAME IS NULL [sage] 2009/02/23(月) 22:20:28 ID:??? if ( !com.Read() ) { // データないときの処理 } : …なんてやってるわけないよね。 http://mevius.5ch.net/test/read.cgi/db/1234077152/39
40: NAME IS NULL [sage] 2009/02/24(火) 08:55:02 ID:??? まさかとは思うが、レコードがないってのは テーブルは存在してるんだよな? http://mevius.5ch.net/test/read.cgi/db/1234077152/40
41: NAME IS NULL [sage] 2009/02/24(火) 19:24:19 ID:??? そこまで疑うのかよww http://mevius.5ch.net/test/read.cgi/db/1234077152/41
42: NAME IS NULL [sage] 2009/02/25(水) 06:57:33 ID:??? >>33 どうやったらっていうか、普通レコードがなくても例外は発生しません JETのSQLが間違ってる時のエラーメッセージはかなりいい加減だからなぁ ほんとにExecuteReaderでエラーになってるなら、フィールド関係ないとは思うんだが、 実際に実行してるSQLは>>33とまったく同一? JETはカラムかテーブル名が見つからないと、パラメータが足りないみたいなメッセージを出す時がある だから>>36や>>40のような指摘があるわけなんだが...nameやsortが予約語だったりするのか? あと可能性としてはMDBが壊れてる可能性もあるな 一度ACCESSで修復かけてみては? http://mevius.5ch.net/test/read.cgi/db/1234077152/42
43: NAME IS NULL [sage] 2009/02/25(水) 11:43:53 ID:??? >>33 ソース見るに finally は try ブロック内で実行されると思ってない? あくまで finally が実行されるタイミングはメソッド終了時。 using で宣言してるオブジェクトが解放されるタイミングもそう。 メソッドがこのソースで完結してるなら問題はでないと思うけど、 ほかにもいろいろ処理が含まれるなら思わぬ問題が出る可能性があるね。 using or try のネストはその辺理解して使わないと後でめんどいよ。 つーことでこのソースだけじゃ不具合原因はわからんと思う。 >>42 が言うように JET のエラーメッセージは当てにならんw http://mevius.5ch.net/test/read.cgi/db/1234077152/43
44: NAME IS NULL [sage] 2009/02/25(水) 22:33:57 ID:??? Dim DS As New DataSet Using db As New SqlConnection(db.ConnectionString) Using ocmd As SqlCommand = db.CreateCommand Using adp As New SqlDataAdapter(cmd) cmd.CommandText = sql1 cmd.Parameters.Clear() cmd.Parameters.AddWithValue("@01","01") adp.Fill(DS) If DS.Tables(0).Rows(0).Item(0).ToString <> "OK" Then msg = DS.Tables(0).Rows(0).Item(0).ToString Return -1 End If Return 1 End Using End Using End Using こんな感じでdataset使ってるんですがdatasetから値を取り出すのってこれがベストな 方法なの? datareaderならgetstringとgetint32とかデータ型にあった方法あるけど http://mevius.5ch.net/test/read.cgi/db/1234077152/44
45: NAME IS NULL [sage] 2009/02/26(木) 01:35:24 ID:??? >>44 単一の値を取ってくるなら、ExecuteScalarを利用すると良いよ。 あと、型があらかじめわかってるならToStringやCTypeよりDirectCastの方が良いな。 http://mevius.5ch.net/test/read.cgi/db/1234077152/45
46: NAME IS NULL [sage] 2009/02/26(木) 04:16:14 ID:??? >>45 揚げ足をとるみたいだが、それはDBから値をとるなら、だな まあ、まずデータセット使う必要があるのかという話もあるんだがw データセットから値を取り出すなら、って質問だし、 ここは型付きデータセット使えってのがMS的推奨回答じゃないかな http://mevius.5ch.net/test/read.cgi/db/1234077152/46
47: NAME IS NULL [sage] 2009/02/26(木) 08:41:34 ID:??? だから2行目のキャスト。上で書いてるGet〜メソッドも型がわかってて使うわけだからさw 型付データセットを使わない場合であれば、どんな型で入ってくるかは http://msdn.microsoft.com/ja-jp/library/cc716729.aspx http://mevius.5ch.net/test/read.cgi/db/1234077152/47
48: 44 [sage] 2009/02/26(木) 11:47:22 ID:??? 型付データセットは手間かかりそうでなんかいやなんだよね^^ さくっとSQL書いて結果欲しい時にいちいちデザイナ?xml?とか http://mevius.5ch.net/test/read.cgi/db/1234077152/48
49: NAME IS NULL [sage] 2009/02/26(木) 13:53:28 ID:??? さくっと結果がほしいだけならデータセット使う必要すらないだろう DataReaderつかえよ。まさに>>45の指摘の通りだ。>>2のまとめも読んでみろ データセットから値をとりだすのは、まあどんな方法も似たり寄ったりだろう コードの書き方とかキャストのしかたとかに多少の差がでる程度かと http://mevius.5ch.net/test/read.cgi/db/1234077152/49
50: NAME IS NULL [sage] 2009/02/27(金) 23:11:52 ID:??? データセットから取り出すコード、個人的にはあまり美しいコードとは思えないんだけど、 そうせざるを得ないんだよなあ・・・(´・ω・`) http://mevius.5ch.net/test/read.cgi/db/1234077152/50
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 371 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.007s