ADO.NETの質問・雑談スレ2 (421レス)
上下前次1-新
30: 2009/02/21(土)17:47 ID:??? AAS
>>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);
}
省3
31: 2009/02/21(土)23:16 ID:??? AAS
>>29
Connectionのusingだけで十分だ。
CommandやDataAdapterのインスタンスがDisposeされるまでに
時間がかかるが、そんなもん放っておけば良い。
重要なアンマネージリソースはConnectionにしかない。
32: 29です 2009/02/21(土)23:50 ID:??? AAS
Dispose基準は重要なリソースか・・・目からウンコがおちたようだ。
せっかくのGCを無駄にするところだったかな。
URLありがとう、じっくり読んでみます。
33(4): 2009/02/23(月)03:34 ID:kcpJjeEI(1) AAS
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();
(データを取得する処理 省略)
}
省17
34: 2009/02/23(月)09:58 ID:wqMGnrpl(1) AAS
>>(データを取得する処理 省略)
while で回してる?
35: 2009/02/23(月)20:30 ID:??? AAS
hasrowでチェックするとかしたら?
36(1): 2009/02/23(月)21:18 ID:??? AAS
クエリの中のどっかがプレースホルダとして認識されてんだろjk
テーブル名と列名全部ブラケットで括ってみ。
//CurrentRecordが無いところでFieldを参照しようとした場合はInvalidOperationExceptionになる。
//OleDbExectionにはならん。
37: 2009/02/23(月)21:31 ID:??? AAS
//同じコードで>>33試してみたが再現せんな…
38: 2009/02/23(月)22:10 ID:??? AAS
>com.ExecuteReader()で
catchで捕まえたからではなく、ステップ実行してそこで例外発生したって認識でOK?
フィールド名のtypoだったらレコードの有無に関わらず発生しそうなものだけど・・・。
同じく試してみたけど再現しないですね。
39: 2009/02/23(月)22:20 ID:??? AAS
if ( !com.Read() )
{
// データないときの処理
}
:
…なんてやってるわけないよね。
40(1): 2009/02/24(火)08:55 ID:??? AAS
まさかとは思うが、レコードがないってのは
テーブルは存在してるんだよな?
41: 2009/02/24(火)19:24 ID:??? AAS
そこまで疑うのかよww
42(1): 2009/02/25(水)06:57 ID:??? AAS
>>33
どうやったらっていうか、普通レコードがなくても例外は発生しません
JETのSQLが間違ってる時のエラーメッセージはかなりいい加減だからなぁ
ほんとにExecuteReaderでエラーになってるなら、フィールド関係ないとは思うんだが、
実際に実行してるSQLは>>33とまったく同一?
JETはカラムかテーブル名が見つからないと、パラメータが足りないみたいなメッセージを出す時がある
だから>>36や>>40のような指摘があるわけなんだが...nameやsortが予約語だったりするのか?
あと可能性としてはMDBが壊れてる可能性もあるな
一度ACCESSで修復かけてみては?
43: 2009/02/25(水)11:43 ID:??? AAS
>>33
ソース見るに finally は try ブロック内で実行されると思ってない?
あくまで finally が実行されるタイミングはメソッド終了時。
using で宣言してるオブジェクトが解放されるタイミングもそう。
メソッドがこのソースで完結してるなら問題はでないと思うけど、
ほかにもいろいろ処理が含まれるなら思わぬ問題が出る可能性があるね。
using or try のネストはその辺理解して使わないと後でめんどいよ。
つーことでこのソースだけじゃ不具合原因はわからんと思う。
>>42 が言うように JET のエラーメッセージは当てにならんw
44(2): 2009/02/25(水)22:33 ID:??? AAS
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
省9
45(2): 2009/02/26(木)01:35 ID:??? AAS
>>44
単一の値を取ってくるなら、ExecuteScalarを利用すると良いよ。
あと、型があらかじめわかってるならToStringやCTypeよりDirectCastの方が良いな。
46: 2009/02/26(木)04:16 ID:??? AAS
>>45
揚げ足をとるみたいだが、それはDBから値をとるなら、だな
まあ、まずデータセット使う必要があるのかという話もあるんだがw
データセットから値を取り出すなら、って質問だし、
ここは型付きデータセット使えってのがMS的推奨回答じゃないかな
47: 2009/02/26(木)08:41 ID:??? AAS
だから2行目のキャスト。上で書いてるGet〜メソッドも型がわかってて使うわけだからさw
型付データセットを使わない場合であれば、どんな型で入ってくるかは
外部リンク[aspx]:msdn.microsoft.com
48: 44 2009/02/26(木)11:47 ID:??? AAS
型付データセットは手間かかりそうでなんかいやなんだよね^^
さくっとSQL書いて結果欲しい時にいちいちデザイナ?xml?とか
49: 2009/02/26(木)13:53 ID:??? AAS
さくっと結果がほしいだけならデータセット使う必要すらないだろう
DataReaderつかえよ。まさに>>45の指摘の通りだ。>>2のまとめも読んでみろ
データセットから値をとりだすのは、まあどんな方法も似たり寄ったりだろう
コードの書き方とかキャストのしかたとかに多少の差がでる程度かと
上下前次1-新書関写板覧索設栞歴
あと 372 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.007s