none
データベースから取得した値をDataTableへセットについて RRS feed

  • 質問

  • 先日下記URLにて、質問をさせて頂きました。
    http://social.msdn.microsoft.com/Forums/ja-JP/vbgeneralja/thread/7ffa57ed-9524-4aee-84ca-2d9bdb030ac6

    Windowsフォーム5からWindowsフォーム2に値を渡す際に、得意先コードのみを渡し
    それをキーにして、フォーム2のテキストボックスに得意先の情報を表示し、データテーブルを作りたく思います。
    フォーム2のtextbox1.textは得意先コードが入ります。

    下記コードで実施するとAdapter.Fill(dt)で止まってしまい、
    connectionstringプロパティは初期化されていませんと表示されてしまいます。
    --------------------------------
    Option Strict On
    Imports System.Data.SqlClient
    Imports System.Configuration   

    Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click

            If TextBox1.Text = Nothing Then
                MessageBox.Show("コード確認")
            End If

            'プログラムコード 
            Dim Cn As New OleDbConnection
            Dim Command As OleDbCommand = New OleDbCommand
            Dim OLEDBCon As OleDb.OleDbConnection = _
                    New OleDb.OleDbConnection

            OLEDBCon.ConnectionString = _
             "Provider=Microsoft.Jet.OLEDB.4.0;" & _
             "Data Source=" & Form1.TextBox1.Text & ";" & _
             "Persist Security Info=False"

            Command.Connection = Cn
            Command.CommandText = "select 得意先コード from 得意先T "

            Dim Adapter As OleDbDataAdapter = New OleDbDataAdapter
            Dim dt As New DataTable

            Adapter.SelectCommand = Command
            Adapter.Fill(dt)

            'レコード取得

            If dt.Rows.Count = 1 Then
               

               TextBox3.Text = CStr(dt.Rows(0).Item(0)) ’郵便番号

                TextBox4.Text = CStr(dt.Rows(0).Item(1)) '住所1

                TextBox5.Text = CStr(dt.Rows(0).Item(2)) ’住所2

                TextBox6.Text = CStr(dt.Rows(0).Item(3)) ’得意先名

            Else
                MessageBox.Show("エラー")
            End If

        End Sub

    宜しくお願い申し上げます

    2012年12月1日 6:58

回答

  • フォーム2のtextbox1.textに得意先コードが入っているので、それをキーワードにしてアクセスから検索をかけてフォーム2のテキストボックス3~6に郵便番号等を表示して、データテーブルを作成したいのですが。

    Command.Parameters.AddWithValue("@得意先コード",) を使うには 値の箇所を form2.textbox1.textにすればよいのでしょうか?

    フォーム間の遷移の詳細までは知りませんが、form2.textBox1.Text の値を使いたいなら

    Command.Parameters.AddWithValue("@得意先コード", form2.textBox1.Text)
    になると思います。

    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答としてマーク ワカバWA 2012年12月5日 4:27
    2012年12月3日 5:59
    モデレータ

すべての返信

  • OleDbConnectionを2個作っていますが、ConnectionStringが設定されていない方をCommand.Connectionに設定しています。
    ConnectionStringが設定されている方を使いましょう。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2012年12月1日 7:26
  • gekka様

    ありがとうございます。>OleDbConnectionを2個作っていますが、ConnectionStringが設定されていない方をCommand.Connectionに設定しています。ConnectionStringが設定されている方を使いましょう。

    →どういう意味でしょうか?私が理解できず申し訳ございません。コードで示して頂けるとありがたいです

    2012年12月1日 8:16
  • 変数Cnと変数OLEDBConとが示しているOleDbConnectionは別のものです。
    ConnectionStringが設定されていないCnをCommand.Connectionに設定してしまっているのでエラーになっています。

    'Command.Connection = Cn
    Command.Connection = OLEDBCon



    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 佐伯玲 2012年12月3日 0:27
    2012年12月1日 9:33
  • gekka様

    ありがとうございました。エラーはでなくなりましたが、Form2のテキストボックス3から6に肝心の値が表示されません。

    アクセスには問い合わせをしていると思うのですが、どういうわけだか表示されないのですが、

    表示され、データテーブルを作るにはどうすれば良いでしょうか?

    2012年12月3日 1:01
  • ブレークポイントで止めて、変数やオブジェクトの値がどうなっているかを見ることができますか?
    例えば、ブレークポイントで止めて、イミディエイトウインドウでdt.Rows(0).Item(0)の値がどうなっているか確認してみて下さい。もしくは、Itemのところにマウスポイントを合わせても値が表示されると思います。

    さて、SQLに問題があります。select 得意先コード from 得意先T ではなく、
    select 郵便番号, 住所1, 住所2, 得意先名 from 得意先T where 得意先コード = @得意先コード
    のようになるはずです。@で始まるところはパラメーターです。パラメーターの使い方で参考になるページは、私がこのスレッドの前のスレッドで投稿しました。このスレッドの一番上で、ワカバWAさんが書かれているURLです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年12月3日 1:50
    モデレータ
  • trapemiya様

    ご回答ありがとうございます。

    ブレークポイントを設定してデバッグを実施しましたが、ブレイクポイントで止まりません。

    vsでブレイクポイント出来ないをキーにして調べてやりましたが、解決に至っていません。                          ついてはデバッグを実施しても、スルーされてしまう状態です。                                                     ですが、itemの所にマウスポイントを合わせると、Public Dafault Property item (column index as integer) as object インデックスで指定した列に格納されているデータを取得または設定しますと表示されます。

    SQLですが、パラメータを入力しないで行う事は出来ないのでしょうか?

    2012年12月3日 3:19
  • ブレークポイントを設定してデバッグを実施しましたが、ブレイクポイントで止まりません。

    「デバッグ開始」で実行されていまか? メニューからではなく、F5キーを押しても「デバッグ開始」で実行できます。
    それでも止まらない場合は、メニューのビルドから構成マネージャーを開き、構成がDebugになっていることを確認して下さい。

    itemの所にマウスポイントを合わせると、Public Dafault Property item (column index as integer) as object インデックスで指定した列に格納されているデータを取得または設定しますと表示されます。

    ブレークポイントで止まっている状態でないとitemの値は表示されません。なぜならプログラムが実行されて初めてitemに値がセットされるからです。

    SQLですが、パラメータを入力しないで行う事は出来ないのでしょうか?

    パラメーターという意味を勘違いされていませんか?ここでいうパラメーターはSQL文中で使用する変数のことです。この変数にForm2に渡されてきた取引先コードをセットし、SQL文を実行することになります。
    パラメーターを使用せずに文字列を連結させてSQL文を作成して実行することもできますが、前述した通り、SQLインジェクションの原因になりますので基本的にしてはいけません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年12月3日 4:44
    モデレータ
  • SQLですが、パラメータを入力しないで行う事は出来ないのでしょうか?

    私も trapemiya さんと同意見です。文字列連結はSQLインジェクションの原因になりやすいため、面倒でもパラメータの使用を強くお勧めします。

    SQLインジェクション攻撃により数億の被害を被ったり、企業が倒産に追い込まれたケースも報告されています。被害の実例は以下 wiki のページをご覧ください。

    SQLインジェクション


    ひらぽん http://d.hatena.ne.jp/hilapon/

    2012年12月3日 5:17
    モデレータ
  • trapemiya様

    ありがとうございます。SQLですが、= @得意先コードの箇所を外してデバッグしておりました。キャッチボールが出来ずすみません。= @得意先コードを入力して行うと、 Adapter.Fill(dt)の所で止まります。 oledbexceptionはハンドルされません。1つ以上の必要なパラメータの値が設定されていないと表示されます。 public function fill(datatable as system.data.datatable) as integer system.data.data.table名を使用してデータソース内の行と一致するようにsystem.data.dataset内の指定した範囲の行を追加または更新しますと表示されております。

    2012年12月3日 5:31
  • > 。= @得意先コードを入力して行うと、 Adapter.Fill(dt)の所で止まります。 oledbexceptionはハンドルされません。1つ以上の必要なパラメータの値が設定されていないと表示されます。

    パラメータ 「@得意先コード」 に値が設定されていないのでは?

    Command.Parameters.AddWithValue("@得意先コード",)

    を実装してますか?



    ひらぽん http://d.hatena.ne.jp/hilapon/

    2012年12月3日 5:42
    モデレータ
  • 追記ですが、初心者には以下の資料もいいかも知れません。情報処理推進機構(IPA) が広く公開している資料です。

    「安全なSQLの呼び出し方」


    ひらぽん http://d.hatena.ne.jp/hilapon/

    2012年12月3日 5:44
    モデレータ
  • ひらぽん様

    ありがとうございます。フォーム2のtextbox1.textに得意先コードが入っているので、それをキーワードにしてアクセスから検索をかけてフォーム2のテキストボックス3~6に郵便番号等を表示して、データテーブルを作成したいのですが。

    Command.Parameters.AddWithValue("@得意先コード",) を使うには 値の箇所を form2.textbox1.textにすればよいのでしょうか?

    2012年12月3日 5:51
  • フォーム2のtextbox1.textに得意先コードが入っているので、それをキーワードにしてアクセスから検索をかけてフォーム2のテキストボックス3~6に郵便番号等を表示して、データテーブルを作成したいのですが。

    Command.Parameters.AddWithValue("@得意先コード",) を使うには 値の箇所を form2.textbox1.textにすればよいのでしょうか?

    フォーム間の遷移の詳細までは知りませんが、form2.textBox1.Text の値を使いたいなら

    Command.Parameters.AddWithValue("@得意先コード", form2.textBox1.Text)
    になると思います。

    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答としてマーク ワカバWA 2012年12月5日 4:27
    2012年12月3日 5:59
    モデレータ
  • ひらぽん様

    ありがとうございました

    2012年12月5日 4:27