11月21日(金)1、2コマ目
今日、やったこと
- [確認テスト 解説]クラスの確認テスト1
- [ODP.NET Core]練習1~3
- [ODP.NET Core]パラメータマーカーを使う
今日のホワイトボード
[確認テスト 解説]クラスの確認テスト1
問1
プロパティを作る問題。get、setの内容はとくに指定がないため、{get; set;}だけでOK。
"クラス外からアクセス可能"->アクセス修飾子はpublic。
|
| 図 クラスの確認テスト1 問1 |
問2
コンストラクタを作る問題。
|
| 図 クラスの確認テスト1 問2 |
問3
引数があるコンストラクタを作る問題。
|
| 図 クラスの確認テスト1 問3 |
問4
メソッドを作る問題。
|
| 図 クラスの確認テスト1 問4 |
問5
問4と同じメソッドを作る問題。
|
| 図 クラスの確認テスト1 問5 |
staticとは
以前、「メソッドにとりあえずつけて」と言っていたstatic。
メソッド以外にも、プロパティやフィールドにもつけることができる。
結論から言えば、
- staticをつけると、クラスに紐づく
- staticなしなら、インスタンスに紐づく
です。
|
| 図 staticとは |
なお、このstaticはJavaでも同じ役割で登場する。
[ODP.NET Core]OracleDataReaderクラス
SQL実行メソッドのExecuteReader()を実行すると、戻り値としてOracleDataReaderクラスのインスタンスを受け取る。
OracleDataReaderクラスは検索結果取得担当。
|
| 図 OracleDataReaderクラス |
OracleDataReaderクラスはRead()メソッドで1行ずつ移動しながら検索結果を取得する。
以下に注意!!
注意1 検索直後は検索結果0行目を参照
検索結果がない可能性もあるため、検索結果の1行目ではなく、0行目を参照している。
注意2 各列の値は型変換が必要
reader[列名]で取得した検索結果は型が未定。<=
検索結果はいろいろな型があるため
Convert.ToInt32()でint型に変換したり、.ToString()でstring型に変換する必要がある。
[ODP.NET Core]練習
簡単な検索をしてもらいました。
練習1
CS_グループマスタテーブルを全件検索して、グループ名を取得。
練習2
CS_商品マスタ、CS_グループマスタを結合して、商品名、グループ名、価格を取得。
SQLが長くなるため、プログラムの可動性を確保するために、途中で改行した。
途中で改行されたSQLは+演算子を使って結合している。
このとき、結合後にどんなSQLになるかを考えること。必要に応じてスペースを入れる必要がある。
|
| 図 文字列結合でSQLを作る際は、結合後を考えること |
練習3
CS_商品マスタ、CS_グループマスタを結合して、各グループの商品点数を検索。
select句の"count(*)"は、検索結果取り出しの際に列名でアクセスできるように別名をつける。
|
| 図 select句の関数には別名をつけること |
検索ごとに検索条件を変更したい
たとえば、価格がxxx以上で検索のように、検索のたびに検索条件xxxを変更したい場合、実行するSQLを文字列結合で作成すれば実現可能。
|
| 図 文字列結合でSQLに結合条件を結合(御法度) |
この方法はぜったいにやらないでください。
セキュリティ面、実行速度の面で問題がある。
パラメータマーカーを使う
検索条件のように、SQL実行のたびに値が変わる箇所にはパラメータマーカーにして、SQL実行時に値をセットする。
|
| 図 パラメータマーカーを使う |
SQL中のパラメータマーカーにアクセスを担当するのが、OracleParameterクラス。
なぜ、検索条件を文字列結合するとマズいのか
攻撃手法の1つ”SQLインジェクション”ができるため。
SQLインジェクションによって本来意図しない検索が行われる。
|
| 図 SQLインジェクション |
次回は
パラメータマーカーの利用例をあと2つ紹介。
そのあと練習問題。











