2015. 4. 10. 09:41

Datatable 사용해서 처리하는 구문이 있었는데 의도하지 않은 방향으로 흘러가 버렸네요...


일단 의도는 다음과 같습니다.


1. 테이블에서 Select 하여 대상 데이터를 선택합니다.

2. 원 테이블을 클리어 시킵니다.

3. 선택된 데이터를 집어 넣습니다.



위 의도대로 아래와 같이 코드를 작성하였습니다

            // 테이블 정의
            DataTable srcDT = new DataTable();
            srcDT.Columns.Add("A1");
            srcDT.Columns.Add("A2");
            srcDT.Columns.Add("A3");
            srcDT.Columns.Add("A4");

            // 데이터 입력
            srcDT.Rows.Add(new object[] { "AAA", "111", "A11", "1AA" });
            srcDT.Rows.Add(new object[] { "BBB", "222", "B11", "1BB" });
            srcDT.Rows.Add(new object[] { "CCC", "333", "C11", "1CC" });

            // 커밋
            srcDT.AcceptChanges();

            // 쿼리
            DataRow[] fDR = srcDT.Select("A1 like '" + "A" + "%'");

            srcDT.Clear();
            foreach (DataRow dr in fDR)
            {
                srcDT.Rows.Add(dr);
            }

            for (int i = 0; i < srcDT.Rows.Count; i++)
            {
                textBox1.AppendText(srcDT.Rows[i][0].ToString() + " | "
                    + srcDT.Rows[i][1] + " | "
                    + srcDT.Rows[i][2] + " | "
                    + srcDT.Rows[i][3] + " | " + "\r\n");
            }


이 소스코드가 잘 돌아갈 것 같이 보입니까?



여기에는 치명적인 문제가 있습니다.

원 테이블을 클리어 시켜 버렸다는 것.


선택된 목록만을 가져오기 위해서 Clear 후 다시 선택된 값을 집어 넣고 있지만...;;


정작 빈 껍데기 row만 들어갑니다.


Select 할 때, 값을 복사해 오는것이 아니고 해당 데이터의 위치주소 값을 가져오는 듯 합니다.

그래서, 테이블 클리어 때 값이 다 지워졌고, 해당 주소값의 row를 다시 추가해 봤자 이미 다 지워진 빈 데이터 만 추가될 뿐이고...




이런 경우 제가 찾은 해결책은 2가지 입니다.


1번째는 목록을 not like 로 가져 온 다음, 해당 하는 행을 remove 로 지워 나가는 것.

2번째는 like 로 가져온 행을 새 테이블에 넣어주는 방법 (넣기 전에 원 테이블이 Clear 되면 안됩니다.)



1번째 소스코드

            // 쿼리
            DataRow[] fDR = srcDT.Select("A1 not like '" + "A%" + "%'");

            //srcDT.Clear();
            foreach (DataRow dr in fDR)
            {
                srcDT.Rows.Remove(dr);
            }

            for (int i = 0; i < srcDT.Rows.Count; i++)
            {
                textBox1.AppendText(srcDT.Rows[i][0].ToString() + " | "
                    + srcDT.Rows[i][1] + " | "
                    + srcDT.Rows[i][2] + " | "
                    + srcDT.Rows[i][3] + " | " + "\r\n");
            } 




2번째 소스코드

            // 쿼리
            DataRow[] fDR = srcDT.Select("A1 like '" + "A" + "%'");

            //srcDT.Clear();
            DataTable srcDT2 = new DataTable();
            srcDT2 = srcDT.Clone();
            foreach (DataRow dr in fDR)
            {
                srcDT2.Rows.Add(dr.ItemArray);
            }

            for (int i = 0; i < srcDT2.Rows.Count; i++)
            {
                textBox1.AppendText(srcDT2.Rows[i][0].ToString() + " | "
                    + srcDT2.Rows[i][1] + " | "
                    + srcDT2.Rows[i][2] + " | "
                    + srcDT2.Rows[i][3] + " | " + "\r\n");
            }






Posted by 해비