DB操作でオチてしまいます。

タグの編集
投稿者 暁春眠  () 投稿日時 2008/7/25 23:55:00
いつもお世話になっております。 
 
現在、VB2005とMSSQL2005を使用してコーディングしております。 
 
 
2つのコンボボックスに同じ値を設定したいのですが、ステップ実行などのクイックウォッチなどで見ると、 
 
Error: cannot obtain value 
 
と表示されてしまいます。 
 
自分で調べたところ、メモリの制約(デバッグ中)に引っかかっているらしいのです。 
 
また、ソースを細分化云々と書いてあったのですが、ソースは極短いものです。 
 
上記のような場合、どの様に対処すればよいのでしょうか? 
 
教えて頂ければ助かります。
投稿者 るしぇ  () 投稿日時 2008/7/26 00:39:00
> ソースを細分化云々 
十分な知識をお持ちで、情報を正しく把握しているのであればもう少し 
明確な説明をお願いします。調査した内容自体も曖昧なのであれば、 
どのサイトを参考にしたとか、原文をこちらで確認できるような説明を 
お願いします。 
 
でないと、曖昧な情報をもとに曖昧な回答しか出来ません。当然のことですが。 
 
下記の内容について言っているのであれば、重要なのは 
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-28361.htm 
>ウォッチ式などで確認できる値やオブジェクトには(メモリ的な)限界があるのでは 
というところですね。 
 
>ソースは極短いものです。 
それだけが原因とは書いてないですよ?次に疑うのは変数に大量データを確保している 
部分が無いか。。。ということですね。 
ざっと話を聞いた限り、無限ループのような処理でも起こって不思議でない気がします。 
ループを1つ書けばメモリを大量に使用するプログラムなどすぐ作れるわけですから、 
ソースが短いから大丈夫というのは理由になってないと思います。 
 
また、根本的な解決ではありませんが、デバッグでクイックウォッチだけの問題である 
なら、ログファイルなどに書き出して内容確認すれば開発には問題ないでしょう。
投稿者 暁春眠  () 投稿日時 2008/7/26 00:53:00
>>1 
ありがとうございます。 
 
ご指摘の通り、変数がdatatable型で、2500行30列程度のデータを持たせてます。 
 
 
そして、厳密には「オチる」ではなく「やたら重い」でした。 
 
参考にしたページも、そのページで間違いないです。 
 
知識も経験も未熟な初心者が生意気な記述ですみませんでした。 
 
気分を害したようでしたらお許し下さい。 
 
 
コードを眺めながら、効率的な処理を考えてみます...。
投稿者 るしぇ  () 投稿日時 2008/7/26 01:15:00
>>2 
>知識も経験も未熟な初心者が生意気な記述ですみませんでした。  
>気分を害したようでしたらお許し下さい。  
そんなに酷い回答でした?確かにボクはろくに調べない人については 
ボロクソに言うこともありますが『おそらくこの程度は調べてるな』 
って分かる書込みに対しては優しい方だと思いますよ?w 
 
せっかく調べてるのだから、相手に伝えてください。とお願いしただけです。 
 
>コードを眺めながら、効率的な処理を考えてみます...。  
そう完結してしまうなら特にこちらからは何も言うことはありませんが、 
データベース検索を含む仕事を幾つもこなしてるプロが何人もいる場で、 
自己完結のみという結論も勿体無い話では? 
 
>2500行30列程度のデータ 
クイックウォッチで見るにはどうかと思うけど、メモリ上で処理する 
データ数としては大したことありません。まずは何が遅いのか切り分けて 
ください。通常、DataTable にその程度のデータを格納するのには1秒 
もかかりません。検索処理の前後で処理時間を計測してみてください。 
 
次に、おそらく画面に表示しているのでしょうが、その表示時間を 
計測してみてください。ここがいわゆるボトルネックなら、使用している 
コントロールやプログラムを検証することになります。 
 
…がクイックウォッチの問題とは別物なんですがねw。クイックウォッチは 
捨てたので良いの? 
# 2500行30列のデータをクイックウォッチで見るのは無謀な気がするけど。
投稿者 暁春眠  () 投稿日時 2008/7/26 03:00:00
>>3 
重ねてありがとうございます。 
 
仰るように、データを取得・表示するときではなく、discriptionを設定するのに時間が掛かっているようです。 
 
如何にせよド素人なんで、とりあえず要求された動きを最優先させ、あとから整理する。といった遠回りな作業を余儀なくされている次第です。 
 
それこそ折角なのでお知恵を拝借させて頂けますでしょうか? 
 
コードの悪い部分を指摘して下さい。 
歯に衣着せぬ指摘が一番ありがたいです。 
 
以下ソース。 
 
Private Sub Set_JAN() 
  Dim strWK As String = "", intWK As Integer = 0 
  Dim lngLP As Long, lngSP As Long 
   
  Dim strSQL As String 
  Dim dtbDB As DataTable 
  Dim strErr As String 
   
  Dim strHinBan As String 
 
  Dim lngNP As Long 
   
  Try 
   
  '------------ 取引マスタ 取得 
  dtbDB = Nothing 
  strSQL = "" 
  strSQL &= " SELECT  DISTINCT  HinBan , HinNam" 
  strSQL &= " FROM ITM_MAST " 
  '--- DB 
  If clsDB.DB_SelectQuery(strSQL, dtbDB) = _ 
  DBcommon.enmReturn.DB_ERROR Then 
    '--- エラーExit 
    strErr = clsDB.ErrorException.Message & _ 
    "(参照エラー)" 
    Throw New System.Exception(strErr) 
  End If 
 
  '--- 指定なし項目 設定 
  lngSP = Me.imcFromJAN.Items.Add("指定なし") 
  Me.imcFromJAN.Items.Item(lngSP).Description = "" 
   
  '--- FromJAN 設定 
  For lngLP = 0 To dtbDB.Rows.Count - 1 
    '------ 設定情報 取得 
    strHinBan = fncGGetFld(dtbDB.Rows(lngLP).Item _ 
    ("HinBan").ToString.Trim, enmType.fldString) 
 
    '---コンボ設定 
    lngNP = Me.imcFromJAN.Items.Add(strHinBan) 
  Next lngLP 
 
  Catch ex As Exception 
  '--- エラーログ出力 
    Call clsCom.WriteErrorLog(ex, Reflection. _ 
    MethodBase.GetCurrentMethod.Name) 
 
  End Try 
 
End Sub 
 
 
Discriptionは一時的に削除しました。 
コンボも一つしか設定してません。
投稿者 暁春眠  () 投稿日時 2008/7/28 18:32:00
お騒がせしました。 
 
そもそも数千件のデータをコンボで表示する事自体が無謀だという事に気づきました。 
 
他の方法を模索する事にします。 
 
 
るしぇさん、お付き合い頂き誠にありがとうございました。