今週も色々苦戦していました。
中でもSQL関係が気になったので、その復習です。
DaoBase(親クラス...多分)にコーディングされている実行処理の中で、SQL実行処理クエリがありました。
DaoBase.cs
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
{
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の話を以前にもしていただいたのに、忘れてしまっていて再度教えてもらいました。
ぬおー悔しい。
そして現在、その悔しさをバネにしつつこの参考書を使って自習してます。
www.amazon.co.jp
この参考書は、綺麗なコードになるまでを詳しく書いてくれているのでわかりやすいです。
わかりやすいといっても、実際にコーディングしながら進めているので数ページ読むのに随分時間がかかってしまいますが…。
今回は以上です。
来週はオブジェクト指向について、今ある知識で頑張って書いていきます。