- 締切済み
分岐処理について
"AAA"、"BBB"という検索条件でdatagridviewに表示させたいのですが、 『argumentNullexceptionはハンドルされませんでした』というMSGが、haisinA.fill(tbl)の部分で止まってしまいます。これを解決するにはどうすればいいのでしょうか? 色々検索とかしてみたのですが混迷してしまって・・・。 ご助言を頂けたら幸いです。宜しくお願い致します。 ******************************************************************************** Dim tbl As New DataTable() Dim haishinA As New OracleDataAdapter 'リスト条件 Dim SBL As String = Me.cbox2.SelectedIndex.ToString If SBL = "0" Then SBL = "AAA" ElseIf SBL = "1" Then SBL = "BBB" End If '検索 Dim SBF1, SBF2 As String SBF1 = "select * from テーブル名 where sendto = 'AAA'" SBF2 = "select * from テーブル名 where sendto = 'BBB'" Console.WriteLine(SBF1) Console.WriteLine(SBF2) haishinA.Fill(tbl) DataGridView1.DataSource = tbl ********************************************************************************
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- ichhabehunger
- ベストアンサー率55% (27/49)
こんにちは。 申し訳ないですが、コードを見る限り何もわかっていないと言っていいと思います。 急がば回れ、一度データベース関係の本をじっくりと読んでみることをお勧めします。 私の場合C#ですので、お勧めは 「Visual C# 2005 逆引き大全 至高の技 データベース+印刷/帳票編」増田智明・池谷京子著 秀和システム 2800円+税 ですが、このVisual Basic版があると思います。検索してみてください。おもにSQL Server 2005が対象ですが、Oracleにもすぐに応用できると思います。 さて、問題のコードですが、要するにコンボボックスで指定された項目による条件によって発行するSQL文を変えたい、ということのようですので、OracleDataAdapterを生成した後は、CommandTextにSQL文を設定し、SelectCommandであることを知らせてDataTableにFillします。 DataAdapterのFillメソッドを使う場合には、OpenもCloseもいりません。 我が家はSQL Server 2008ですが、これで動きます。 Imports System.Data.SqlClient Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ComboBox1.SelectedIndex = 0 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim tbl As New DataTable() Dim scn As New SqlConnection("Data Source=ICHHABEHUNGER\SQLEXPRESS;Integrated Security=True;Initial Catalog=SQL10") Dim sAdp As New SqlDataAdapter() Dim sCom As New SqlCommand() sCom.Connection = scn sCom.CommandText = "SELECT * FROM dbo.Book WHERE publish = '" + ComboBox1.SelectedItem + "'" sAdp.SelectCommand = sCom sAdp.Fill(tbl) DataGridView1.DataSource = tbl End Sub End Class
- MARU4812
- ベストアンサー率43% (196/452)
> Imports Oracle.DataAccess.Client ODP.NET か。。。過去やったことはあるけど、もう環境つぶしたので テストできませんね。Microsoftの用意しているものでは無いんですから 記述しておいてもらわないと回答に影響する情報ですよ。 環境を用意している暇は無いので概要だけになります。 基本的にはデータが表示できるコードなら OracleCommand.CommandText を書き換えるだけのはずです。 OracleDataAdapter インスタンス生成時に SelectCommand を 設定するのではなく、OracleConnection、OracleCommand、 OracleDataAdapter を順に設定していく手順に変えた方が 良いと思いますよ。 'リスト条件 ~ '検索 ~ のコードは現時点では検索に何の影響も及ぼしていないので、 前質問の検索ができたコードを利用してるなら >『argumentNullexceptionはハンドルされませんでした』と > いうMSGが、haisinA.fill(tbl)の部分で止まってしまいます。 この状況にはならないはずです。 コードをいじってるうちに、できてた部分を悪い形で修正 してしまったんじゃないですか? モジュールレベルと関数レベルで同じ名前で変数宣言 しちゃってますし、スコープを理解してのコーディングなら まだしも、勉強不足でよく分からないままにプログラムして るなら、モジュールレベルの変数宣言は削除しておいて ください。 con も関数内の宣言で統一した方が良いでしょう。 その上で、 >SBF1、SBF2の情報をhaishinA.Fill(tbl)に関連付けの所で、苦戦しています・・・。 関連付け以前に、文字列を編集するだけの処理が書けて いないように見えますが? そこができるなら、SQLを編集した後でデータベースに 接続するオブジェクトを設定するだけでしょう? 変数宣言と同時にNewするのはやめて、SQLの編集してから インスタンス生成したらどうでしょうか。
お礼
MARU4812さま ご助言ありがとうございます。無知ながら質問してしまってすみません。1からやり直します。
- MARU4812
- ベストアンサー率43% (196/452)
データベースに接続する情報が一切書かれていません。 http://qanda.rakuten.ne.jp/qa6398681.html 前の質問でデータベース接続は解決したはずですので 最低限それが分かるコードを公開して下さい。
補足
情報が不足して申し訳ありません。以下がコードです。 SBF1、SBF2の情報をhaishinA.Fill(tbl)に関連付けの所で、苦戦しています・・・。 ***************************************** Imports Oracle.DataAccess.Client Imports Oracle.DataAccess.Types Imports System.Windows Imports System.Diagnostics Public Class Haishin Dim con As OracleConnection Dim haishinA As OracleDataAdapter '=========== '検索ボタン '=========== Private Sub btn1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_find1.Click con = New OracleConnection con.ConnectionString = "User Id =aaa;Password=bbb;Data Source=ccc" con.Open() Dim tbl As New DataTable() Dim haishinA As New OracleDataAdapter(" select * from テーブル名 ", con) 'リスト条件 Dim SBL As String = Me.cbox2.SelectedIndex.ToString If SBL = "0" Then SBL = "AAA" ElseIf SBL = "1" Then SBL = "BBB" End If '検索 Dim SBF1, SBF2 As String SBF1 = "select * from haisin_plesedison_a where sendto = 'AAA'" SBF2 = "select * from haisin_plesedison_a where sendto = 'BBB'" Console.WriteLine(SBF1) Console.WriteLine(SBF2) ''考え中end haishinA.Fill(tbl) DataGridView1.DataSource = tbl Me.DataGridView1.Visible = True MessageBox.Show("検索処理は終了しました。") con.Close() End Sub '画面終了ボタン Private Sub btn_exit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_exit.Click Me.Close() End Sub End Class
- ichhabehunger
- ベストアンサー率55% (27/49)
おっと、とんでもない的外れな回答をしてしまいました。 Dim SBL As String = Me.cbox2.SelectedIndex.ToString この部分で変数「SBL」は初期化されていますね。 であれば、原因はここに示されていないコードにあると思われます。 情報をもっと公開すべきでしょう。
- ichhabehunger
- ベストアンサー率55% (27/49)
こんにちは。 それはたぶん 変数「SBL」が初期化されずに使われているため、中身が 「0」でも「1」でもなくて「null」なので、SQL文発行の時に 怒られているのではないかと思われます。 コードで言えば次の箇所 Dim SBL As String = Me.cbox2.SelectedIndex.ToString If SBL = "0" Then SBL = "AAA" ElseIf SBL = "1" Then SBL = "BBB" End If ただ、これでコードがすべてではないと思いますが、いかが? これだけのコードでは絶対に動きませんよねぇ。
お礼
ichhabehungerさま ご助言ありがとうございます。 同様の書籍もリサーチしてみます。 色々ヒントも頂きありがとございます。