プログラミングと日々思ったことなど

ブログ名通りです。仕事でプログラミングをはじめました。

SQLクエリ実行処理など

今週も色々苦戦していました。
中でも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の話を以前にもしていただいたのに、忘れてしまっていて再度教えてもらいました。
ぬおー悔しい。

そして現在、その悔しさをバネにしつつこの参考書を使って自習してます。

www.amazon.co.jp


この参考書は、綺麗なコードになるまでを詳しく書いてくれているのでわかりやすいです。
わかりやすいといっても、実際にコーディングしながら進めているので数ページ読むのに随分時間がかかってしまいますが…。



今回は以上です。
来週はオブジェクト指向について、今ある知識で頑張って書いていきます。