MySQLにODBC接続でリストボックスに表示するには?


sum  2005-03-24 21:20:11  No: 120412

MySQLサーバーにODBCドライバで接続して、一覧を表示させたいと思っています。

使用は、コマンドボタンクリック時イベントで。

VBは昨日触り始めたところの超初心者です。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim cn As Object
        Dim rs As Object

        cn = CreateObject("ADODB.Connection")
        cn.Open("dsn=DSN;uid=id;pwd=pass")
        cn.CursorLocation = 3

        rs = cn.Execute("select * from 工事")

        rs.Close()

        cn.Close()

    End Sub

いろいろ調べたら、こんな感じかなと思うのですが、リストボックスに
反映させるコードがわかりません。

どなたかわかる方、どうぞよろしくお願いします。


medaka  2005-03-25 02:39:59  No: 120413

ループさせながらListBoxにaddメソッドで追加すればいいのでは?
addメソッドの書き方はHelpに書いています
ループはWhileをHelpで検索したらわかるかと思います。


sum  2005-03-25 03:13:24  No: 120414

Do While (Not rs.EOF)

            Me.ListBox1.Items.Add("")
                                     ↑
            rs.MoveNext()          |
        Loop                       |
こういうことですか?                |
                                      |
ここは何を入れたいいですか?ーーーーー


赤ペン  2005-03-25 04:19:29  No: 120415

これではどうでしょうか?

    List1.AddItem "表示させたいもの"
    
    例)
    List1.AddItem rs.Fields(0).Value


魔界の仮面弁士  2005-03-25 04:32:11  No: 120416

旧VBからの移行作業でしょうか?
.NET では ADO ではなく、ADO.NET を使った方が良いですよ。

ADODB も一応は使えますが、ADO は ActiveXコンポーネントですので、
Marshal.ReleaseComObjectメソッドでオブジェクトの解放処理を
行う必要が生じるため、ADO.NET よりも取り扱いが面倒です。

提示されたコードでは、「ReleaseComObject」での解放処理を怠っていますが、
もしも ADO を使うのであれば、後々のためにも、きちんと解放処理を
記述される事をお勧めします。
http://support.microsoft.com/kb/321415/ja


sum  2005-03-26 05:36:07  No: 120417

赤ペンさん、魔界の仮面弁士さん、返答ありがとうございます。
Me.ListBox1.Items.Add("rs.Fields(0).Value")
と入れたのですが、複数列を表示するにはどのようにしたらよいのでしょうか?

それと、ADO.NETを調べたんですけどよくわかりません。

もしよろしければサンプルでも書いていただけたらと思います。
よろしくお願いします。


ささ  2005-03-27 10:59:36  No: 120418

>>それと、ADO.NETを調べたんですけどよくわかりません。

自分の場合、はまるときは一晩二晩ぐらい悩んでますが
動作させるだけのサンプルはいかにもネット上に落ちてるものなので30分程
ぐぐればすぐ見つかりましたよ?

環境をつくってコピペで済みましたが…。
よく分かるのは後々でよいのでは?


sum  2005-03-29 00:11:25  No: 120419

とりあえず,複数表示をさせることは出来ました。
皆さんお手数をおかけしました。
ただ、行によってはばらばらに配列されてしまいます。
一定の幅で表示したのですが、どのようにしたらよろしいのでしょうか?

よろしくお願いします。

ちなみに、ADO.NETはいまだにわかりません。
探してはいるんですけど見つかりません。
(見つかっているんですけど、サンプルみたいなのにはあたりません)


特攻隊長まるるう  2005-03-29 01:26:07  No: 120420

>ただ、行によってはばらばらに配列されてしまいます。
>一定の幅で表示したのですが、どのようにしたらよろしいのでしょうか?
複数表示をするコードは一つではありません。コードを
示さずに質問されても答えられるわけがありません。
フォントを変えて適当な空白でも入れれば良いんじゃないですか?。

>ちなみに、ADO.NETはいまだにわかりません。
>探してはいるんですけど見つかりません。
>(見つかっているんですけど、サンプルみたいなのにはあたりません)
@ITのADO.NET基礎講座を一通りとマイクロソフトのホームページから
情報を得ればそれなりに分かるはずですが?ぐーぐる検索で何のひねりもなく
検索されます。…分からないままでいるほうが難しいです。
http://www.google.com/search?hl=ja&q=ADO+.NET&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja

[マイクロソフトのサイトで検索]
http://search.microsoft.com/search/results.aspx?st=b&qu=ADO.NET&view=ja-jp

ちゃんと勉強するなら本を買って下さい。…例えば
http://www.amazon.co.jp/exec/obidos/ASIN/4891003170/249-6371333-9144362

それよりなにより[VB.NET]のヘルプは調べましたか?
[ADO.NET を使用したデータのアクセス]オンラインヘルプ(MSDNをインストールしてれば同じ記事がローカルにもあります)
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconaccessingdatawithadonet.asp

ここの掲示板の過去ログ検索では?

…どういう調べ方をすれば分からないままでいられるのか是非教えて下さい。


ささ  2005-03-29 02:23:11  No: 120421

キーワードの選定に致命的な問題があるようです。
解決方法を示唆するのではなく、
ネットから情報の探し方、調べ方を教えた方が早く解決するように思います。

http://www.amazon.co.jp/exec/obidos/ASIN/4839914923


sum  2005-03-31 02:17:02  No: 120422

すいませんコードを書いてなかったですね。
一応こんな感じです。

        Do While (Not rs.EOF)
            ' 処理を記入
            I = I + 1
            Me.ListBox1.Items.Add(rs.Fields(0).Value & vbTab & rs.Fields(2).Value)

            rs.MoveNext()
        Loop

ほんとはrs.fields(*)がもっとあるのですけどあいだに "& vbTab" いれています。
データの桁数がいっしょのところはいいのですが、ところによっては3桁とか15桁とかあります。

なんかいい方法はありますか?
よろしくお願いします。


特攻隊長まるるう  2005-03-31 02:52:34  No: 120423

だからタブがダメなんでしょ?一応それなりの回答はしてあるんだけどなぁ…
>フォントを変えて適当な空白でも入れれば良いんじゃないですか?。
等幅フォントにして一番長い文字列に合わせて空白(スペース)入れる
だけだと思いますが?Format とか使う?


sum  2005-03-31 04:18:54  No: 120424

>等幅フォントにして一番長い文字列に合わせて空白(スペース)入れる
>だけだと思いますが?Format とか使う?

すいません、意味がわかりません。

        Do While (Not rs.EOF)
            ' 処理を記入
            I = I + 1
            Me.ListBox1.Items.Add(rs.Fields(0).Value & "   " & rs.Fields(2).Value)

            rs.MoveNext()
        Loop

こういうことですか?


medaka  2005-03-31 17:35:46  No: 120425

right(space(20) & rs.Fields(0).Value,20) & "   " & 
right(space(20) & rs.Fields(2).Value,20) 
こういうこと?


魔界の仮面弁士  2005-03-31 18:55:56  No: 120426

表示桁数の問題は、他の人に任せるとして……別の部分に関して。

>  Do While (Not rs.EOF)
While Not にするよりも、Until を使った方がスマートな気がします。

ADOを使うのであれば、
> Me.ListBox1.Items.Add(rs.Fields(0).Value & "   " & rs.Fields(2).Value)
これはまずいと思いますよ。ReleaseComObjectされていませんから。

先に紹介した記事に、もう一度目を通しておいてください。
http://support.microsoft.com/kb/321415/ja
ここには、
  ADO を .NET COM interop で使用すると、高負荷下でアクセス違反が
  発生する可能性があるが、以下のコーディングにて、この問題が
  発生する可能性を抑えられる。
といった内容が書かれており、そのコーディングとして
 ・ReleaseComObject メソッドを使用する。
 ・ADODB の PIA(プライマリ相互運用アセンブリ)を利用する。
などの手法が書かれています。

ADODB は ActiveXコンポーネントであるため、ReleaseComObject で
明示的に解放処理を行わないと、オブジェクトがメモリ上に
残ってしまい、幾つかの問題を引き起こす可能性があります。
# Excelの場合などが有名ですね。( http://support.microsoft.com/kb/317109/ja )

(「ADO.NET」の場合は ActiveX ではないため、ReleaseComObject は不要です)

で。もしもどうしても (ADO.NET ではなく) ADO を使う必要があるならば、
先に紹介した記事の内容にしたがって、

   Dim I As Integer
   Dim Cn As New ADODB.ConnectionClass()
   Cn.Provider = "Microsoft.Jet.OLEDB.4.0"
   Cn.Open("C:\db1.mdb")
   Dim Rs As New ADODB.RecordsetClass()
   Rs.Open("SELECT * FROM TestTable", Cn)
   Dim Fs As ADODB.Fields = Rs.Fields  'Fieldsオブジェクトを取得
   Dim F0 As ADODB.Field = Fs(0)       'Fieldオブジェクトを取得
   Dim F2 As ADODB.Field = Fs(2)       'Fieldオブジェクトを取得
   Do Until Rs.EOF
      I += 1
      Me.ListBox1.Items.Add(F0.Value.ToString() & vbTab & F2.Value.ToString())
      Rs.MoveNext()
   Loop
   System.Runtime.InteropServices.Marshal.ReleaseComObject(F2)
   System.Runtime.InteropServices.Marshal.ReleaseComObject(F0)
   System.Runtime.InteropServices.Marshal.ReleaseComObject(Fs)
   Rs.Close()
   System.Runtime.InteropServices.Marshal.ReleaseComObject(Rs)
   Cn.Close()
   System.Runtime.InteropServices.Marshal.ReleaseComObject(Cn)

のようなコードを書く必要があるかと思います。
(最後に、個々のオブジェクトを ReleaseComObjectで解放しています)

もしくは、(Filedオブジェクトの)Valueプロパティを使う代わりに、
(Recordsetオブジェクトの)Collectプロパティを利用すると良いでしょう。

この場合、Fileds/Fieldオブジェクトを取得せずに値を取れますので、
ReleaseComObjectさせる手間を軽減させる事ができます。

   Do Until Rs.EOF
      I += 1
      Me.ListBox1.Items.Add(Rs.Collect(0).ToString() & vbTab & Rs.Collect(2).ToString().ToString())
      Rs.MoveNext()
   Loop
   Rs.Close()
   System.Runtime.InteropServices.Marshal.ReleaseComObject(Rs)
   Cn.Close()
   System.Runtime.InteropServices.Marshal.ReleaseComObject(Cn)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加