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"); } |