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

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

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

Re[2]: 選択肢によってSQL文が変化する方法


(過去ログ 58 を表示中)

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

■32859 / inTopicNo.1)  選択肢によってSQL文が変化する方法
  
□投稿者/ Neil (3回)-(2009/02/16(Mon) 22:39:34)

分類:[ASP.NET (C#)] 

こんにちは。いつもお世話になっております。
現在、ASP.NET(C#)とSQL SERVER、javascriptを使用したWEBシステムを開発しているのですが、

ドロップダウンリストで「会社」「エリア」「支店」「店名」「従業員」の順に指定していくのですが、
「会社」(データベース項目名:company)コードを設定し、「店名」(データベース項目名:tempo)まで設定すると選択可能な「従業員」がデータベースから引き出される形で開発しています。

そこで、会社を辞めてしまった・退職した人間は省いた形で抽出する為に、以下のコードを書いたのですが、

query.Append("SELECT ");
query.AppendFormat("EmployeeCode as {0}," Datavalue_Fieldname);
query.AppendFormat("IsNull(LastName, '') + ' ' + IsNull(FirstName, '') as {0} ", Datatext);
query.AppendFormat("From {0} ", Tablename.employee);

//会社 か 店舗 が「全て(all)」の指定でない場合は、以下の処理をする
if(company != "all" && tempo != "all") 
{
query.AppendFormat("WHERE (company = {0}) ", queryUtility.ConvertString(company));
query.AppendFormat("AND (tempo = {0}) ", queryUtility.ConvertString(tempo));
query.AppendFormat("AND (DeleteFlg = {0}) ", DBValue.False);

//退職日時が空白
query.AppendFormat("AND (RetireDate IS NULL) ");

//現在の日付より退職日が未来の場合は取得
query.AppendFormat("OR (RetireDate >= {0}) ", Datetime.Now.ToString("d"));
}
else
{
query.AppendFormat("WHERE (company = {0}) ", queryUtility.ConvertString(company));
query.AppendFormat("AND (tempo = {0}) ", queryUtility.ConvertString(tempo));
query.AppendFormat("AND (DeleteFlg = {0}) ", DBValue.False);
}


このように書くと退職日が現在から未来の指定になっている人間に対して、「会社」や「店舗」が退職予定の人間の所属する所と違っていても取得されてしまう現象が起きてしまいました。
どこの会社・店舗の人間なのかを判断するのは、companyとtempoで行っており、毎回ドロップダウンリストを選択しなおす度に変化する呼ばれるイベントなのですが、どのようにSQLを書けば選択した「会社」〜「店舗」までのデータを持つ人間だけを絞り込んで取得出来るのでしょうか・・・?


どなたかお手数ではございますが、ご教授ください。お願い致します。

引用返信 編集キー/
■32860 / inTopicNo.2)  Re[1]: 選択肢によってSQL文が変化する方法
□投稿者/ まさる (76回)-(2009/02/16(Mon) 23:08:48)
まさる さんの Web サイト
No32859 (Neil さん) に返信
> //退職日時が空白
> query.AppendFormat("AND (RetireDate IS NULL) ");
>
> //現在の日付より退職日が未来の場合は取得
> query.AppendFormat("OR (RetireDate >= {0}) ", Datetime.Now.ToString("d"));

実際に作成されたSQLを確認してみましたか?

おそらく上記箇所が

AND (RetireDate IS NULL) OR (RetireDate >= {0})

になっていますよね。

これでは

OR (RetireDate >= {0})

が全体にかかってしまいます。

実際にしたいことは退職日がNULLか当日以降ということなので、

AND ( (RetireDate IS NULL) OR (RetireDate >= {0}) )

でなければならないはずです。


さて、本題とは外れますが、

query.AppendFormat("WHERE (company = {0}) ", queryUtility.ConvertString(company));

というような書き方ですと、SQLインジェクションの危険がありますので、
ここいらへん(http://www.atmarkit.co.jp/fdotnet/basics/adonet03/adonet03_02.html#parameter)を参考に、
SqlParameterを用いた形式に直すことをお勧めします。
引用返信 編集キー/
■33014 / inTopicNo.3)  Re[2]: 選択肢によってSQL文が変化する方法
□投稿者/ Neil (4回)-(2009/02/18(Wed) 21:44:29)
No32860 (まさる さん) に返信
> ■No32859 (Neil さん) に返信
>>//退職日時が空白
>>query.AppendFormat("AND (RetireDate IS NULL) ");
>>
>>//現在の日付より退職日が未来の場合は取得
>>query.AppendFormat("OR (RetireDate >= {0}) ", Datetime.Now.ToString("d"));
>
> 実際に作成されたSQLを確認してみましたか?
>
> おそらく上記箇所が
>
> AND (RetireDate IS NULL) OR (RetireDate >= {0})
>
> になっていますよね。
>
> これでは
>
> OR (RetireDate >= {0})
>
> が全体にかかってしまいます。
>
> 実際にしたいことは退職日がNULLか当日以降ということなので、
>
> AND ( (RetireDate IS NULL) OR (RetireDate >= {0}) )
>
> でなければならないはずです。
>
>
> さて、本題とは外れますが、
>
> query.AppendFormat("WHERE (company = {0}) ", queryUtility.ConvertString(company));
>
> というような書き方ですと、SQLインジェクションの危険がありますので、
> ここいらへん(http://www.atmarkit.co.jp/fdotnet/basics/adonet03/adonet03_02.html#parameter)を参考に、
> SqlParameterを用いた形式に直すことをお勧めします。

まさる さま>

お返事が遅れまして大変失礼致しました。有難うございます。
SQL文のかっこの括り方に問題があったのですね・・・。全然その点が迂闊でした。
もっとSQL勉強するべきですね。本当に有難うございます。

インジェクションの問題の件は、私が開発に関わる前からこのシステム全域で使われているロジックなので・・・ここ以外にも沢山ありまして、今回改修には手を付けられないですが・・・今後上やクライアントと相談の上で考えます。
ご忠告有難うございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -