- PR -

SQLのWHERE句の条件式設定

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-25 08:36
サービス:

簡単には、
dim sql as string = "SELECT 〜 WHERE ID='" & 変数 & "'"

ただしこれだと、変数に「'; DELETE TABLE_NAME; --」などと入れられると、テーブルが消えてしまうという、セキュリティホールを作り込む可能性がある。


そこでパラメータを使う。実際の使い方はマニュアル参照のこと。

dim cmd as DBCOMMAND _
= new DBCOMMAND("SELECT 〜 WHERE ID = パラメータ文字列", 接続文字列)
cmd.parameters.add(パラメータ名, タイプ, サイズ)
cmd.parameters.item(0).value = 値
hur0308
常連さん
会議室デビュー日: 2004/02/13
投稿数: 20
投稿日時: 2004-02-25 22:59
Jittaさんに教えていただいた内容を元に以下のように処理を記述したのですが、エラーとなってしまい、1日かけて調べたのですが、どうしても原因がわかりません。
わかる方、教えてください。

◆処理内容
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim myConnString As String = ConfigurationSettings.AppSettings("dBkey1")
Dim myConnection As New OracleConnection(myConnString)

Dim mycmd As New OracleCommand("SELECT NO FROM TBL WHERE ID=aram")
Dim oda As New OracleDataAdapter(mycmd)

mycmd.Parameters.Add("param", OracleType.Char, 5).Direction = ParameterDirection.Input
mycmd.Parameters.Item(0).Value = "00000"
oda.SelectCommand = mycmd


oda.Fill(DataSet1)
DataGrid1.DataBind()
myConnection.Close()
End Sub

◆エラー
値を Null にすることはできません。パラメータ名 : dataSet
説明 : 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.ArgumentNullException: 値を Null にすることはできません。パラメータ名 : dataSet

ソース エラー:
行 59: oda.Fill(DataSet1)
行 60: DataGrid1.DataBind()
行 61: myConnection.Close()

ソース ファイル : c:\inetpub\wwwroot\WebApplication7\WebForm4.aspx.vb 行 : 59

スタック トレース:

[ArgumentNullException: 値を Null にすることはできません。
パラメータ名 : dataSet]
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +103
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) +38
WebApplication7.WebForm4.Button2_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\WebApplication7\WebForm4.aspx.vb:59
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain() +1277

hur0308
常連さん
会議室デビュー日: 2004/02/13
投稿数: 20
投稿日時: 2004-02-25 23:08

一部文字化けしてしまいました。
:param を設定しています(半角で!)

(正)Dim mycmd As New OracleCommand("SELECT NO FROM TBL WHERE ID=:param")

わかるかた、ご教授ください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-26 00:31
 したの「BBコードを使わない」にチェックすると、:pなどが顔文字になりません。詳しくは「BBコード」がリンクなので、クリックしてください。

 そして、エラーですが、まさかDataSet1がまだnewしていない、なんてことはないですよね?
hur0308
常連さん
会議室デビュー日: 2004/02/13
投稿数: 20
投稿日時: 2004-02-26 15:27
Jittaさん、ありがとうございます。
そのまさかを設定していませんでした。(素人ですみません)
ただ、エラーは出力されなくなりましたが、DataGridに何も表示されません。
以下の処理内容以外にもいろいろ試したのですが、表示されないです。

Oracleのsql*plusで、"SELECT NO FROM TBL WHERE ID='00000'" を実行すると
結果が表示されますのでsqlに問題は無いと思います。

どこが悪いのでしょうか?

◆処理内容
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim myConnString As String = ConfigurationSettings.AppSettings("dBkey1")
Dim myConnection As New OracleConnection(myConnString)
Dim DS As New DataSet()

Dim mycmd As New OracleCommand("SELECT NO FROM TBL WHERE ID=:param")
Dim oda As New OracleDataAdapter(mycmd)

mycmd.Parameters.Add("param", OracleType.Char, 5).Direction = ParameterDirection.Input
mycmd.Parameters.Item(0).Value = "00000"
oda.SelectCommand = mycmd

oda.Fill(DS)
DataGrid1.DataBind()
myConnection.Close()
End Sub
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-02-26 15:40
引用:

hur0308さんの書き込み (2004-02-26 15:27) より:

oda.Fill(DS)
DataGrid1.DataBind()


で、データグリッドとデータセットはどこで結びついてるんでしょう?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-26 15:43
引用:

hur0308さんの書き込み (2004-02-26 15:27) より:

oda.Fill(DS)
DataGrid1.DataBind()


 おしい!あと1行(か、2行)。
 とりあえず、MSDNで「BaseDataList.DataBind メソッド」を見てみてください。太字とリンクに注目。

#もろかぶり

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-02-26 15:44 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-26 15:44
#追記:すごい勢いで内容がかぶったみたいです。すいません。

引用:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim myConnString As String = ConfigurationSettings.AppSettings("dBkey1")
Dim myConnection As New OracleConnection(myConnString)
Dim DS As New DataSet()

Dim mycmd As New OracleCommand("SELECT NO FROM TBL WHERE ID=:Param")
Dim oda As New OracleDataAdapter(mycmd)

mycmd.Parameters.Add("param", OracleType.Char, 5).Direction = ParameterDirection.Input
mycmd.Parameters.Item(0).Value = "00000"
oda.SelectCommand = mycmd

oda.Fill(DS)
DataGrid1.DataBind()
myConnection.Close()
End Sub



NAL-6295です。

上記コード中に、DataGrid1のDataSourceにデータセットを登録している場所は
ありますか?
なければ、データグリッドに表示されません。

何故か・・・

DataGrid1は、表示すべきデータがどれかを知らないからです。
DataSourceに登録する事により、どのデータを表示すべきかを知ることができるのです。



[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-02-26 15:45 ]

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-02-26 15:46 ]

スキルアップ/キャリアアップ(JOB@IT)