'MS/C#'에 해당되는 글 24건

  1. 2013.07.26 IList to DataTable Convert Module
  2. 2013.07.26 mybatis dot net mapper 조건문 활용
  3. 2013.07.23 mybatis dot net Sample

IList to DataTable Convert Module

|

using System.ComponentModel; using System.Data; public static DataTable toDataTable(this IList data, string tableName) { PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T)); DataTable table = new DataTable(); foreach (PropertyDescriptor prop in props) { table.Columns.Add(prop.Name, prop.PropertyType); } object[] values = new object[props.Count]; foreach (T item in data) { for (int i = 0; i < values.Length; i++) { values[i] = props[i].GetValue(item); } table.Rows.Add(values); } table.TableName = tableName; return table; }


function type에 static 템플릿(<T>)이 들어 있기 때문에 일반 public class로 컴파일시 에러가 뜰 것이다.

이 경우 class 자체도 static으로 바꿔 주면 문제가 없겠다.


And

mybatis dot net mapper 조건문 활용

|
mybatis dot net 관련 레퍼런스 참조 http://ibatis.apache.org/docs/dotnet/datamapper/

mapper 작성시 xml을 사용 하게 되는데 mybatis 관련 인텔리센스가 작동하지 않을 것이다.
이에 대한 대처 방법은 mybatis dot net version을 다운 받아서 압축 해제시 안에 XML Schema file이 존재 할 것이다.
해당 file을 VS가 설치된 위치의 예를 들어 VS2010일 경우 "C:\Program Files\Microsoft Visual Studio 10.0\" 정도 될 것이다.
간단하게 VS_HOME이라 하겠다.
"VS_HOME\xml\Schemas\" 위치에 복사 해 준다.
그리고 VS를 실행 시킨후 인텔리센스가 작동하는지 확인한다.

<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="dao" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ibatis.apache.org/mapping">
    <alias>
        <typeAlias alias="rsltCarryIn" type="dao.model.vo.RsltCarryInVo"/>
    </alias>
    <resultMaps>
        <resultMap id="rsltCarryInMap" class="rsltCarryIn">
            <result property="SumValue" column="SUM_VALUE"/>
            <result property="BrandCode" column="BRAND_CODE"/>
        </resultMap>
    </resultMaps>
    <statements>
        <select id="getRsltCarryIn" resultMap="rsltCarryInMap" parameterClass="System.Collections.Hashtable">
            SELECT SUM(INTEG_VALUE)SUM_VALUE, BRAND_CODE FROM RSLT_STOCK
            <dynamic prepend="WHERE">
                <isNotEmpty prepend="AND" property="WorkDate">
                    WORK_DATE = #WorkDate#
                </isNotEmpty>
                <isNotEmpty prepend="AND" property="YardCode">
                    YARD_CODE = #YardCode# AND INTEG_VALUE > 0
                </isNotEmpty>
            </dynamic>
            GROUP BY BRAND_CODE
        </select>
    </statements>
</sqlMap>


위 예문은 동적 쿼리 생성 mapper이다.

dao에서 System.Collections.Hashtable type의 변수를 받아서 조건에 맞게 쿼리를 생성시켜 준다.

Hashtable의 key값이 property 명과 매치되고 그 값이 #propertyName#과 매칭 된다 보면 되겠다.


예문에서 isNotEmpty prepend="AND" property="WorkDate" 이런식으로 되어 있는데

파라메터의 WorkDate 값이 존재 할 경우 밑에 있는 WOKR_DATE = #WorkDate# 의 조건식을 추가 한다.

뭐 이런식이 될 것이다.


dynamic의 item으로 isNotEmpty 말고도 isNotNull 이라든지 여러가지가 존재 한다. 이 항목은 레퍼런스를 참조 하기 바란다.


그럼 dao의 C# Code를 한번 보겠다.


        public IList<RsltCarryInVo> getRsltCarryIn(string WorkDate, string YardCode)
        {
            Hashtable param = new Hashtable();
            param.Add("WorkDate", WorkDate);
            param.Add("YardCode", YardCode);
            IList<RsltCarryInVo> rtnVal = DaoFactory.getInstance.QueryForList<RsltCarryInVo>("getRsltCarryIn", param);
            return rtnVal;
        }


이 전에 포스팅 했던 코드와 유사 하다.

하나 추가된 것이 있다면 파라메터를 받을 수 있는 Hashtable을 추가 했다는거

key는 string이 되고 값은 object이다.

위에 mapper에서 사용한 property명과 key 값이 일치 하는걸 볼 수 있다.


대략 이런식으로 내용을 추가해서 사용하면 되겠다.

And

mybatis dot net Sample

|

우선 mybatis 사용을 위해 Framework를 다운 받는다.(https://code.google.com/p/mybatisnet/)




dll 및 .config .xml file로 구성되 있으면 Samle을 수정하여 사용 할 것이다.

Ibatis.DataMapper Version을 다운 받으면 그 안에 sample.SqlMap.config file이 존재 한다.

이 파일을 SqlMap.config file로 수정후 project안에 포함 시켜 준다.

하나의 .config file이 더 있는데 providers.config file이다 이 file도 포함시켜 준다.

providers.config file은 xml형식으로 되어 있으며


  <provider 

    name="oracleClient1.0" 

    description="Oracle, Microsoft provider V1.0.5000.0" 

    enabled="true" 

    assemblyName="System.Data.OracleClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.OracleClient.OracleConnection" 

    commandClass="System.Data.OracleClient.OracleCommand" 

    parameterClass="System.Data.OracleClient.OracleParameter" 

    parameterDbTypeClass="System.Data.OracleClient.OracleType" 

    parameterDbTypeProperty="OracleType" 

    dataAdapterClass="System.Data.OracleClient.OracleDataAdapter" 

    commandBuilderClass="System.Data.OracleClient.OracleCommandBuilder" 

    usePositionalParameters="false" 

    useParameterPrefixInSql="true" 

    useParameterPrefixInParameter="false" 

    parameterPrefix=":"

    allowMARS="false"    

  />


이런 이이템들이 여럿 있을 것이다. 여기서 손댈 속성은 enabled속성으로 해당 provider를 활성화 시킬것인지를 선택하는 항목이다

name 속성은 다음 SqlMap.config에서 provider를 지정할때 사용할 것이다.


우선 oracle로 Test 할 것이니 oraclejClient1.0을 뺀 모든 provider를 enabled 속성을 false로 놓는다.


다음으로 SqlMap.config file을 수정한다.


<?xml version="1.0" encoding="utf-8"?>

<sqlMapConfig 

  xmlns="http://ibatis.apache.org/dataMapper" 

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">


<settings>

<setting useStatementNamespaces="false"/>

<setting cacheModelsEnabled="true"/>

<setting validateSqlMap="false"/>

</settings>


<providers embedded="Dao.conf.providers.config, Dao"/>


<!-- Database connection information -->

<database>

<provider name="oracleClient1.0"/>

<dataSource name="XXX" connectionString="Data Source=SourceXX;Persist Security Info=True;User ID=UserXX;Password=PwdXXX;Unicode=True"/>

</database>


<sqlMaps>

<sqlMap embedded="Dao.model.mapper.SrcMach.xml, Dao" />

</sqlMaps>


</sqlMapConfig> 


먼저 providers에 embedded 속성값을 설정한다.

속성값으로는 위에는 Dao.conf.providers.config로 되어 있는데 이는 namespace가 Dao(Project명이 Dao)이고 그 안에 conf 디렉터리안에 providers.config가 위치해 있다는 설명이 될 수 있다. 그리고 , Dao는 root namespace가 될 것이다(어셈블리의 이름)


providers.config file을 지정 했으니 그 안에 있는 provider를 사용 할 수 있는데 매칭은 name속성으로 된다.

enable이 ture로 설정 되어 있는 name을 그대로 provider에 옮겨 준후 dataSource를 설정해 준다.


이렇게 해 주면 DB 접속 설정은 마무리 된다.


이 설정한 SqlMap.config file과 providers.config file의 속성을 보는 봐와 같이 리소스 포함으로 변경시킨다.



꼭 리소스 포함에 집어 넣을 필요는 없다. copy always나 copy if newer로 지정하고 

embedded 대신 resource="path/file.xml" 형식으로 변환 시키면 된다.


이제 DB에서 사용할 Vo를 정의 한다. Class에 get set 프로퍼티를 만들어 주면 되는 형식이다.


    public class SrcMachVo

    {

        private int m_MachTag;

        private string m_MachName;


        public int MachTag { get { return this.m_MachTag; } set { this.m_MachTag = value; } }

        public string MachName { get { return this.m_MachName; } set { this.m_MachName = value; } }

    } 


VS2005 Ver을 사용하여 이런 형식 밖에 취하지 못했다.


VS2008 Ver 이상이라면 아래와 같은 형식으로 같단하게 취해줘도 되겠다.

    public class SrcMachVo

    {

        public int MachTag { get ;  set ; } 

        public string MachName { get; set ; }

    } 


이제 mapper를 만들어 볼것이다.

<?xml version="1.0" encoding="utf-8" ?>

<sqlMap namespace="Dao" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ibatis.apache.org/mapping">

<alias>

<typeAlias alias="srcMach" type="Dao.model.vo.SrcMachVo"/>

</alias>

<resultMaps>

<resultMap id="srcMachRsltMap" class="srcMach">

<result property="MachTag" column="MACH_TAG"/>

<result property="MachName" column="MACH_NAME"/>

</resultMap>

</resultMaps>

<statements>

<select id="getSrcMach" resultMap="srcMachRsltMap">

SELECT * FROM TB_MACH

</select>

</statements>

</sqlMap>  


위에 namespace에 root namespace인 project name을 넣어 준다.

alias에 DB와 메칭될 vo를 설정해 준다. alias는 뒤에 resultMap이라 던가 returntype의 값으로 사용할 것이다.

type을 보는 full path의 class 명을 넣어준다.


resultMap은 DB의 column과 Vo의 속성과 매칭 시켜주는 역활을 한다.

property에 Vo 속성값을 넣어 주고 column에 해당 DB의 column명을 넣어 준다.


이제 마지막으로 statements에 Query문을 넣어 주면 되겠다. 각 select, insert, update등으로 넣어 줄 수 있다.


id에는 중복되지 않게 어떤 Query를 사용할 것인지 지정해 주는 속성이 되겠다.

resultMap속성은 위에 지정한 resultMaps의 id를 지정해 주면 된다. 이 resultMaps는 여러개 지정가능하며 재 사용 가능하다.


이 mapper file도 빌드 액션을 리소스포함에 넣어 준다.


이제 만든 mapper를 등록시켜 줄 것이다. 등록은 SqlMap.config file의 sqlMaps안에 해당 file을 매칭 시켜 주면 된다. 이는 providers 설정과 같은 형식을 취하고 있다. file을 매칭시켜 보자.


이제 라이브러리 안에서 사용할 Factory를 재 정의 할 것이다.



using System.Xml;

using IBatisNet.Common.Utilities;

using IBatisNet.DataMapper;

using IBatisNet.DataMapper.Configuration;


    public class DaoFactory

    {

        private static object syncLock = new object();

        private static ISqlMapper mapper = null;


        public static ISqlMapper getInstance

        {

            get

            {

                try

                {

                    if (mapper == null)

                    {

                        lock (syncLock)

                        {

                            if (mapper == null)

                            {

                                DomSqlMapBuilder dom = new DomSqlMapBuilder();

                                XmlDocument sqlMapConf = Resources.GetEmbeddedResourceAsXmlDocument("conf.SqlMap.config, Dao");

                                mapper = dom.Configure(sqlMapConf);

                            }

                        }

                    }

                }

                catch

                {

                    throw;

                }

                return mapper;

            }

        }

    } 


대략 이런식이 되겠다. ("conf.SqlMap.config, Dao") 이부분은 해당 사항에 맞춰 쓰면 되겠다.


마지막으로 Dao를 만들어 주면 사용할 준비는 완료 된것.


    public class SrcMachDao

    {

        public IList<SrcMachVo> getSrcMach()

        {

            IList<SrcMachVo> list = DaoFactory.getInstance.QueryForList<SrcMachVo>("getSrcMach", null);

            return list;

        }

    }  


"getSrcMach"이부분은 mapper의 id와 매칭 된다. 그리고 null 부분은 받을 수 있는 인 수 인다. dot net에서 이 부분에 대해서는 나중에 포스팅 하겠다.


준비가 이걸로 끝났다.


이제 사용 하면 된다.

web이든 windowsapp이든 해당 lib를 포함시킨 후 Dao만 가져다 쓰면 끝


만약 form이라면 이런식으로 사용하면 된다. list에 Data가 채워져 있을 것이다.!

        public Form1()

        {

            InitializeComponent();

            SrcMachDao machlist = new SrcMachDao();

            IList<SrcMachVo> list = machlist.getSrcMach();

        } 



참고 : VS2010 이상 컴파일이 제대로 되지 않을 경우 프레임워크를 4.0으로 놓고 해 보시길.. 

And
prev | 1 | 2 | 3 | 4 | 5 | ··· | 8 | next