今週も色々苦戦していました。
中でもSQL関係が気になったので、その復習です。
DaoBase(親クラス...多分)にコーディングされている実行処理の中で、SQL実行処理クエリがありました。
DaoBase.cs
//機能名称 SQLクエリ実行処理 //パラメータで受け取ったSQL文を実行し、結果セット //SQL条件パラメータ protected DataTable ExecuteQuery(string sSql, IDbDataParameter[] collection, string tblName) { try { DataSet ds = new DataSet(); connection = DbFactory.GetCommand(sSql,connection) comm.Parameters.Clear(); if(conParams.Driver == "ORACLE") { foreach(OracleParameter p in collection) { comm.Parameters.Add(p); } }else { //ココの処理がよくわからない明日聞く // 5.16 ifの条件、DriverでORACLEかSqlserverか切り替えていた。 //が、何らかの理由でその必要がなくなったため、この部分が残った(今ココは通りません) foreach(OracleParameter p in collection) { comm.Parameters.Add(p); } } log.Debug(comm.CommandText); //アダプタ作成 adapter = DbFactory.CreateAdapter(comm); adapter.Fill(ds); ds.Tables[0].TableName = tblName; return ds.Tables[0]; } catch(Exception ex) { log.Info("SQLクエリ実行時エラー",ex); return new DataTable(); } finally { DbFactory.ReleaseConnection(connection); } } }
これによって、子クラスのSQLクエリも実行されるようになります。
またconnectionは、web.config内でパラメータが定義されています。
<add key="DRIVER" value="ORACLE" /> <add key="ConnectionCnt" value="2" />
valueが2なので、connectionが2より多く繋がれると、エラーが発生します。
そうして、DaoBaseにてクエリ実行処理がコーディングされていることによって、実行できるのが以下の情報取得処理です。
namespace Logic { public class DaoImpl:DaoBase,IDaoaa { readonly log4net.Ilog log = log4net.LogManager.GetLogger (System.Reflaction.MethodBase.GetCurrentMethod().DeclaringType); public DaoImpl() :base() { } //情報取得処理 public DtoaaList GetDtoList(DtoaaList dto) { string sSql = string.Empty; sSql = @" SELECT aa ,bb ,cc ,...略 FROM aa_COLUMNS ORDER BY aa,bb "; try { DataTable dt = ExecuteQuery(sSql,"aa_COLUMNS"); dto.Merge(dt,true,MissingSchemeAction.Ignore); } catch(Exception ex) { log.Error("テーブル情報取得エラー",ex); } return dto; } } }
この処理で、データをDtoから取ってきています。
なので、同じDaoの中でセレクト文を作成するときにはconnectionは使用しなくて良いのです。
ちなみにこの中でLIKE文を使用するときには、||で%を囲わなければ文字だと判別してくれないようです。
-----ここから雑記
このconnectionの話を以前にもしていただいたのに、忘れてしまっていて再度教えてもらいました。
ぬおー悔しい。
そして現在、その悔しさをバネにしつつこの参考書を使って自習してます。
この参考書は、綺麗なコードになるまでを詳しく書いてくれているのでわかりやすいです。
わかりやすいといっても、実際にコーディングしながら進めているので数ページ読むのに随分時間がかかってしまいますが…。
今回は以上です。
来週はオブジェクト指向について、今ある知識で頑張って書いていきます。