トップ回答者
データベースから取得した値をDataTableへセットについて

質問
-
先日下記URLにて、質問をさせて頂きました。
http://social.msdn.microsoft.com/Forums/ja-JP/vbgeneralja/thread/7ffa57ed-9524-4aee-84ca-2d9bdb030ac6Windowsフォーム5からWindowsフォーム2に値を渡す際に、得意先コードのみを渡し
それをキーにして、フォーム2のテキストボックスに得意先の情報を表示し、データテーブルを作りたく思います。
フォーム2のtextbox1.textは得意先コードが入ります。下記コードで実施するとAdapter.Fill(dt)で止まってしまい、
connectionstringプロパティは初期化されていませんと表示されてしまいます。
--------------------------------
Option Strict On
Imports System.Data.SqlClient
Imports System.ConfigurationPrivate 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.OleDbConnectionOLEDBCon.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 DataTableAdapter.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 IfEnd Sub
宜しくお願い申し上げます
回答
-
フォーム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
すべての返信
-
変数Cnと変数OLEDBConとが示しているOleDbConnectionは別のものです。
ConnectionStringが設定されていないCnをCommand.Connectionに設定してしまっているのでエラーになっています。
'Command.Connection = Cn Command.Connection = OLEDBCon
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 佐伯玲 2012年12月3日 0:27
-
ブレークポイントで止めて、変数やオブジェクトの値がどうなっているかを見ることができますか?
例えば、ブレークポイントで止めて、イミディエイトウインドウで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/
-
trapemiya様
ご回答ありがとうございます。
ブレークポイントを設定してデバッグを実施しましたが、ブレイクポイントで止まりません。
vsでブレイクポイント出来ないをキーにして調べてやりましたが、解決に至っていません。 ついてはデバッグを実施しても、スルーされてしまう状態です。 ですが、itemの所にマウスポイントを合わせると、Public Dafault Property item (column index as integer) as object インデックスで指定した列に格納されているデータを取得または設定しますと表示されます。
SQLですが、パラメータを入力しないで行う事は出来ないのでしょうか?
-
ブレークポイントを設定してデバッグを実施しましたが、ブレイクポイントで止まりません。
「デバッグ開始」で実行されていまか? メニューからではなく、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/
-
SQLですが、パラメータを入力しないで行う事は出来ないのでしょうか?
私も trapemiya さんと同意見です。文字列連結はSQLインジェクションの原因になりやすいため、面倒でもパラメータの使用を強くお勧めします。
SQLインジェクション攻撃により数億の被害を被ったり、企業が倒産に追い込まれたケースも報告されています。被害の実例は以下 wiki のページをご覧ください。
ひらぽん http://d.hatena.ne.jp/hilapon/
-
trapemiya様
ありがとうございます。SQLですが、= @得意先コードの箇所を外してデバッグしておりました。キャッチボールが出来ずすみません。= @得意先コードを入力して行うと、 Adapter.Fill(dt)の所で止まります。 oledbexceptionはハンドルされません。1つ以上の必要なパラメータの値が設定されていないと表示されます。 public function fill(datatable as system.data.datatable) as integer system.data.data.table名を使用してデータソース内の行と一致するようにsystem.data.dataset内の指定した範囲の行を追加または更新しますと表示されております。
-
フォーム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