C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[12]: SQLのキーワード検索


(過去ログ 33 を表示中)

[トピック内 18 記事 (1 - 18 表示)]  << 0 >>

■16591 / inTopicNo.1)  SQLのキーワード検索
  
□投稿者/ hiro (1回)-(2008/04/08(Tue) 16:12:46)

分類:[.NET 全般] 

よろしくお願いします。

現在VB.net2003でアクセスからSQLでテーブルをDataGridに表示させています。
そこでテキストボックスにキーワードを入れそのキーワードを含むレコードを検索するSQLを
SELECT * FROM 得意先テーブル WHERE (会社名 Like '*" & TextBox1.Text & "*')としたのですが
TextBox1.Textのところに定数式が必要です。とエラーが出てしまいます。
どうすればいいのでしょうか?
引用返信 編集キー/
■16592 / inTopicNo.2)  Re[1]: SQLのキーワード検索
□投稿者/ やじゅ (279回)-(2008/04/08(Tue) 16:30:07)
No16591 (hiro さん) に返信
> SELECT * FROM 得意先テーブル WHERE (会社名 Like '*" & TextBox1.Text & "*')としたのですが
> TextBox1.Textのところに定数式が必要です。とエラーが出てしまいます。
> どうすればいいのでしょうか?
>

二重引用符を見直す。
"SELECT * FROM 得意先テーブル WHERE (会社名 Like '*" & TextBox1.Text & "*')"

引用返信 編集キー/
■16593 / inTopicNo.3)  Re[1]: SQLのキーワード検索
□投稿者/ はつね (564回)-(2008/04/08(Tue) 16:48:14)
はつね さんの Web サイト
No16591 (hiro さん) に返信
> そこでテキストボックスにキーワードを入れそのキーワードを含むレコードを検索するSQLを
> SELECT * FROM 得意先テーブル WHERE (会社名 Like '*" & TextBox1.Text & "*')としたのですが
> TextBox1.Textのところに定数式が必要です。とエラーが出てしまいます。
> どうすればいいのでしょうか?

テキストボックスの内容をそのままSQL文に組み立ててはダメです。
SQLインジェクションという言葉を調べてみて下さい。

--以下、動作未確認---
        Using _cn As New System.Data.OleDb.OleDbConnection
                 :
               (中略)
                 :
            Using _cmd As New System.Data.OleDb.OleDbCommand
                Dim company As String = "*" & Me.TextBox1.Text.Trim & "*"
                _cmd.Connection = _cn
                _cmd.Parameters.Add("?company", company)
                _cmd.CommandText = "SELECT * FROM 得意先テーブル WHERE (会社名 Like ?company)"
                 :
               (中略)
                 :
            End Using
        End Using

引用返信 編集キー/
■16594 / inTopicNo.4)  Re[2]: SQLのキーワード検索
□投稿者/ hiro (2回)-(2008/04/08(Tue) 16:52:42)
No16592 (やじゅ さん) に返信
> ■No16591 (hiro さん) に返信
>>SELECT * FROM 得意先テーブル WHERE (会社名 Like '*" & TextBox1.Text & "*')としたのですが
>>TextBox1.Textのところに定数式が必要です。とエラーが出てしまいます。
>>どうすればいいのでしょうか?
> >
>
> 二重引用符を見直す。
> "SELECT * FROM 得意先テーブル WHERE (会社名 Like '*" & TextBox1.Text & "*')"
>
返答ありがとうございます。定数式が必要ですのエラーは解決したのですが
'データセットにデータを取得する
OleDA.Fill(dtSet, "得意先テーブル")のところで
'System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました。
となってしまいました。
申し訳ありませんがご指導お願いします。
引用返信 編集キー/
■16595 / inTopicNo.5)  Re[2]: SQLのキーワード検索
□投稿者/ hiro (3回)-(2008/04/08(Tue) 16:54:08)
No16593 (はつね さん) に返信
> ■No16591 (hiro さん) に返信
>>そこでテキストボックスにキーワードを入れそのキーワードを含むレコードを検索するSQLを
>>SELECT * FROM 得意先テーブル WHERE (会社名 Like '*" & TextBox1.Text & "*')としたのですが
>>TextBox1.Textのところに定数式が必要です。とエラーが出てしまいます。
>>どうすればいいのでしょうか?
>
> テキストボックスの内容をそのままSQL文に組み立ててはダメです。
> SQLインジェクションという言葉を調べてみて下さい。
>
> --以下、動作未確認---
> Using _cn As New System.Data.OleDb.OleDbConnection
> :
> (中略)
> :
> Using _cmd As New System.Data.OleDb.OleDbCommand
> Dim company As String = "*" & Me.TextBox1.Text.Trim & "*"
> _cmd.Connection = _cn
> _cmd.Parameters.Add("?company", company)
> _cmd.CommandText = "SELECT * FROM 得意先テーブル WHERE (会社名 Like ?company)"
> :
> (中略)
> :
> End Using
> End Using
>


返答ありがとうございます。早速調べさせていただきます。
引用返信 編集キー/
■16604 / inTopicNo.6)  Re[3]: SQLのキーワード検索
□投稿者/ やじゅ (280回)-(2008/04/08(Tue) 19:21:57)
No16594 (hiro さん) に返信
> 'データセットにデータを取得する
> OleDA.Fill(dtSet, "得意先テーブル")のところで
> 'System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました。
> となってしまいました。

ADO.NETでは、Like句は「*」の代わりに「%」を使用します。
引用返信 編集キー/
■16641 / inTopicNo.7)  Re[3]: SQLのキーワード検索
□投稿者/ hiro (4回)-(2008/04/09(Wed) 09:53:18)
おはようございます。
回答ありがとうございます。

早速書き換え『*』をの部分を『%』に変更したのですが、データセットにデータを取得するのところで
'System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました。になります。
何回も申し訳ありませんがお願いします。


コードはこのようにしています。

     Dim OleConn As New OleDb.OleDbConnection
        Dim OleDA As New OleDb.OleDbDataAdapter
        Dim oCommand As New OleDb.OleDbCommand
        Dim dtSet As DataSet = New DataSet("得意先テーブル")
        '2)接続文字列の作成
        OleConn.ConnectionString = _
            "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=C:\Documents and Settings\SHO\My Documents\データベース.mdb;" & _
            "Persist Security Info=False"
        'コネクションの設定
        oCommand.Connection = OleConn
        'SQLの定義
        Const sqlString As String = "SELECT * FROM 得意先テーブル WHERE (会社名 Like % & TextBox1.Text & %)"
        OleDA.SelectCommand = oCommand
        oCommand.CommandText = sqlString
        dtSet.Clear()
    'データセットにデータを取得する
        OleDA.Fill(dtSet, "得意先テーブル")
        DataGrid1.DataSource() = dtSet.Tables(0)

引用返信 編集キー/
■16643 / inTopicNo.8)  Re[4]: SQLのキーワード検索
□投稿者/ やじゅ (283回)-(2008/04/09(Wed) 10:14:50)
No16641 (hiro さん) に返信
> 早速書き換え『*』をの部分を『%』に変更したのですが、データセットにデータを取得するのところで
> 'System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました。になります。
> 何回も申し訳ありませんがお願いします。
>

Const sqlString As String = "SELECT * FROM 得意先テーブル WHERE (会社名 Like % & TextBox1.Text & %)"
なんで、シングルコーテーション消しちゃうの? しかも前よりぼろぼろだし・・・

Const sqlString As String = "SELECT * FROM 得意先テーブル WHERE (会社名 Like '%" & TextBox1.Text & "%)"

初音さんの添うなら、↓かな
Dim company As String = "%" & Me.TextBox1.Text.Trim & "%"
_cmd.Connection = _cn
_cmd.Parameters.Add("?company", company)
_cmd.CommandText = "SELECT * FROM 得意先テーブル WHERE (会社名 Like ?company)"
引用返信 編集キー/
■16644 / inTopicNo.9)  Re[5]: SQLのキーワード検索
□投稿者/ はつね (568回)-(2008/04/09(Wed) 10:27:18)
はつね さんの Web サイト
"SELECT * FROM 得意先テーブル WHERE (会社名 Like '%" & TextBox1.Text & "%')"

のようにテキストボックスの内容をそのままSQL文に設定するような方法は、テキストボックスに入力がないときのチェックをしていたとしても「' OR 1=1 OR '%'='」とか入れられたら

"SELECT * FROM 得意先テーブル WHERE (会社名 Like '%' OR 1=1 OR '%'='%')"

となってしまい、全レコード取得できてしまいます。
入力なければ全件とかが仕様としてあれば問題はないのかも知れませんが、SQL文の組み立て方法としてParametersを使うクセをつけておいた方がいいです。
昔ならいざしらず、今作成しているコードでここら辺を考慮してコーディングしていないのか確実にダメだと思います。



引用返信 編集キー/
■16645 / inTopicNo.10)  Re[5]: SQLのキーワード検索
□投稿者/ はつね (569回)-(2008/04/09(Wed) 10:32:30)
はつね さんの Web サイト
No16643 (やじゅ さん) に返信
> 初音さんの添うなら、↓かな

フォローサンキューです。

引用返信 編集キー/
■16647 / inTopicNo.11)  Re[6]: SQLのキーワード検索
□投稿者/ Mr.T (220回)-(2008/04/09(Wed) 11:01:57)
Mr.Tです。
文法的なものは、やじゅさん、はつねさんがフォローしているので、
デバッグとして一つ。

SQLをまず疑ってかかる。
これは基本です。

ステップ実行(F5、F10、F11とか使ってくださいな)
ブレークポイント(F9でセット/リセット)
ウォッチウィンドウ
   ブレークで停止
   ウォッチウィンドウに変数をちゃちゃっと入力、若しくは変数をハイライト状態にして右クリック。
   SQLコピペ。(CTRL+C)
   Accessのクエリでもなんでもいいけど、貼り付け。
   実行

これで見たら、Accessのクエリ上で、'がないとかいってくれたはず。


No16645 (はつね さん) に返信
> ■No16643 (やじゅ さん) に返信
>>初音さんの添うなら、↓かな
>
> フォローサンキューです。
>
引用返信 編集キー/
■16656 / inTopicNo.12)  Re[7]: SQLのキーワード検索
□投稿者/ はつね (571回)-(2008/04/09(Wed) 11:42:36)
はつね さんの Web サイト
No16647 (Mr.T さん) に返信
>    Accessのクエリでもなんでもいいけど、貼り付け。
>    実行
>
> これで見たら、Accessのクエリ上で、'がないとかいってくれたはず。

OLEDB経由とAccess直接だとSQL文が異なりませんか?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14765&forum=7

引用返信 編集キー/
■16658 / inTopicNo.13)  Re[8]: SQLのキーワード検索
□投稿者/ Mr.T (221回)-(2008/04/09(Wed) 12:20:01)
> OLEDB経由とAccess直接だとSQL文が異なりませんか?
> http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14765&forum=7

確かに%を*に変更しないと、そのままはムリでしたね。
Access対象ってのを見落としてた...

とはいえ、デバッグして欲しいのは変わりないです。

#訂正ありがとうございます>はつねさん





引用返信 編集キー/
■16659 / inTopicNo.14)  Re[8]: SQLのキーワード検索
□投稿者/ hiro (5回)-(2008/04/09(Wed) 12:37:56)
Parametersプロパティについて初めて知りました。
勉強になりますありがとうございます。
SQLを見直します。

引用返信 編集キー/
■16664 / inTopicNo.15)  Re[9]: SQLのキーワード検索
□投稿者/ hiro (7回)-(2008/04/09(Wed) 13:49:31)
Accessで
SELECT 得意先テーブル.会社名 FROM 得意先テーブル WHERE (((得意先テーブル.会社名) Like '*" & TextBox1.Text & "*'))
でエラーが出なかったので
.netの方で
"SELECT 得意先テーブル.会社名 FROM 得意先テーブル WHERE (((得意先テーブル.会社名) Like '%" & TextBox1.Text & "%'))"
と変え入力したのですがTextBox1.Textのところに定数式が必要です。と出てきてしまいます。

どうすればいいのでしょうか教えてください。
引用返信 編集キー/
■16666 / inTopicNo.16)  Re[10]: SQLのキーワード検索
□投稿者/ Mr.T (224回)-(2008/04/09(Wed) 14:22:49)
> .netの方で
> "SELECT 得意先テーブル.会社名 FROM 得意先テーブル WHERE (((得意先テーブル.会社名) Like '%" & TextBox1.Text & "%'))"
> と変え入力したのですがTextBox1.Textのところに定数式が必要です。と出てきてしまいます。

Const sqlString As String = 〜

これが原因です。
Constの場合、定数(決まった値)でなければ値として利用できません。
#どうしてConst宣言したのかなぁ?

普通に変数として
Dim sqlString as String
と定義してください。


引用返信 編集キー/
■16667 / inTopicNo.17)  Re[11]: SQLのキーワード検索
□投稿者/ hiro (8回)-(2008/04/09(Wed) 14:41:50)
無事動きました。
まだデータベースについて勉強を始めたばかりだったので助かりました。

回答してくださった方々本当にありがとうございました。

解決済み
引用返信 編集キー/
■16668 / inTopicNo.18)  Re[12]: SQLのキーワード検索
□投稿者/ はつね (572回)-(2008/04/09(Wed) 15:03:16)
はつね さんの Web サイト
No16667 (hiro さん) に返信
> 無事動きました。

後から検索した方が嵌らないように、SQLインジェクションの危険性がありますので「無事」じゃないことを明記させて頂きます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -